2017-08-17 5 views
-1

Hinweis lernen: Update # 1 und Update # 2 hat UserDAOImpl.java, HibernateConfig.java, UserServiceImpl.javamuss ich über org.hibernate.HibernateException

näher erhalten, wie ich

wissen, dass Sie eine Transaktion von Hibernate SessionFactory sein müssen. Das Ausführen von Abfragen nach dem Abrufen der Sitzung mit getCurrentSession() funktioniert erst, wenn Sie eine Transaktion ausführen. Wenn Sie also @Transactional in Ihrem @Repository oder @Service verwenden, würde Spring eine Transaktion für Abfragen seiner Methode anwenden.

Warum EntityManager, nicht Transaktion benötigen werde ich in

graben

Ich muss wissen, was diese Ausnahme zu lesen, um zu verstehen, was bedeutet:

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread 

Ich weiß, dass einige Antworten schlägt @EnableTransactionManagement, und einige Antworten @Transactional, ich werde Lösungen für jetzt kopieren/einfügen.

Ich bin ein sehr einfacher Benutzer, ich weiß nicht viel über RDBMS, ich kenne die Grundlagen des Umgangs mit MySQL, also Wenn Sie nur eine Reihe von Themen zum Lesen auflisten könnten, wäre das genug.

Update # 1

Ich habe zwei Abfragen, die eine Arbeit und das andere gibt mir diese Ausnahme und ich habe nicht @Transactional auf keinem meiner Serviceklassen:

UserDAOImpl.java

@Component 
public class UserDAOImpl implements UserDAO { 

    @Autowired 
    private SessionFactory sessionFactory; 

    // Works well 
    @Override 
    public User findByUsername(String username) { 
     return (User) sessionFactory.createEntityManager() 
         .createQuery("from User where username = :username") 
         .setParameter("username", username) 
         .getSingleResult(); 
    } 

    // Gives me the exception 
    @Override 
    public User findByUsernameOneColumn(String username, String column) { 
     return (User) sessionFactory.getCurrentSession() 
         .createQuery("select :column from User where username = :username") 
         .setParameter("column", column) 
         .setParameter("username", username) 
         .getSingleResult(); 
    } 


} 

Deshalb brauchte ich mehr zu lesen und nicht kopieren und einfügen, sollte ich nicht -1 gegeben werden, muss ich gut lernen.

Update # 2

HibernateConfig.java

@Configuration 
@EnableTransactionManagement 
public class HibernateConfig { 

    @Bean 
    public DataSource dataSource() { 
     DataSource dataSource = new DataSource(); 
     dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 
     dataSource.setUrl("jdbc:mysql://localhost:3306/medicallabDB"); 
     dataSource.setUsername("root"); 
     dataSource.setPassword("root"); 

     return dataSource; 
    } 

    @Bean 
    public HibernateTransactionManager transactionManager() { 
     return new HibernateTransactionManager(sessionFactory().getObject()); 
    } 

    @Bean 
    public LocalSessionFactoryBean sessionFactory() { 
     LocalSessionFactoryBean localSessionFactory = new LocalSessionFactoryBean(); 

     try { 
      localSessionFactory.setDataSource(dataSource()); 
      localSessionFactory.setHibernateProperties(hibernateProperties()); 
      localSessionFactory.setPackagesToScan("medicallab.web.model"); 


      localSessionFactory.afterPropertiesSet();   

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return localSessionFactory; 
    } 

    private Properties hibernateProperties() { 
     Properties hibernateProperties = new Properties(); 
     hibernateProperties.setProperty("dialect", "org.hibernate.dialect.MySQLDialect"); 
     hibernateProperties.setProperty("hibernate.show_sql", "true"); 
     hibernateProperties.setProperty("hibernate.hbm2ddl.auto", "update"); 

     return hibernateProperties; 
    } 
} 

UserServiceImpl.java

@Service 
public class UserServiceImpl implements UserService { 
    @Autowired 
    private UserDAO userDAO; 

    public User findByUsername(String username) { 
     return userDAO.findByUsername(username); 
    } 

    @Override 
    public User findByUsernameOneColumn(String username, String column) { 
     User user = null; 

     try { 
      user = userDAO.findByUsernameOneColumn(username, column); 
      System.out.println("user object" + user); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 

     return user; 
    } 

    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
     User user = findByUsername(username); 

     if (user == null) { 
      throw new UsernameNotFoundException("No such user: " + username); 
     } 

     return new User(user); 
    } 
} 

Antwort

0

Sie müssen die Transaktionsunterstützung (oder @EnableTransactionManagement) ermöglichen und erklären, der Transac tionManager und es sollte durch die SessionFactory funktionieren.

Sie müssen @Transactional in Ihr @Repository

Mit @Transactional in Ihrem @Repository Spring ist in der Lage Transaktionsunterstützung in Ihrem Repository anzuwenden.

+0

Ich habe meine Frage aktualisiert, um Text klar zu machen. –

+0

Bitte laden Sie Ihren vollständigen Code hoch. Und erkläre deine Frage richtig – Shanmugapriya

+0

Okay @ Shanmugapriya, das ist, warum die Frage über das Lernen, so dass ich nicht verschiedene Kopie/Paste anwenden, bis ich das Problem bestehen, bereite ich es vor. –

Verwandte Themen