2017-08-17 2 views
-1

注:更新#1と更新#2はUserDAOImpl.javaは、HibernateConfig.java、UserServiceImpl.javaは私はorg.hibernate.HibernateExceptionについて学ぶ必要がある

取得したIよう

近いですあなたがHibernate SessionFactoryからのトランザクションである必要があることを知ってください。 getCurrentSession()を使用してセッションを取得した後でクエリを実行すると、トランザクションが発生するまで動作しません。 @Repositoryまたは@Serviceで@Transactionalを使用すると、そのメソッドのクエリに対してSpringがトランザクションを適用できるようになります。

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

私はいくつかの答えを示唆していることを知っている:EntityManagerのトランザクションを必要としなかったのはなぜ

、私はこの例外が何を意味するのか理解するために読むことを知る必要があり


掘り下げます@EnableTransactionManagement、そしていくつかの回答@Transactional、私は今のところ解決策をコピー/ペーストします。

私は非常に基本的なユーザーですが、私はRDBMSについてあまりよく知らないので、MySQLを扱う方法の基礎を知っています。

更新#1

私は1つの作業や他のは私にこの例外を与え、私は私のサービスクラスのいずれかに@Transactionalを持っていないという2つのクエリがあります

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(); 
    } 


} 

は、私は私にはよく学ぶ必要がある、-1を与えられるべきではありません。

更新#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); 
    } 
} 

答えて

0

あなたはトランザクションのサポートを有効にする(または@EnableTransactionManagement)と宣言する必要がありますトランサックSessionFactoryを介して動作する必要があります。あなたの@Repository春に@Transactionalであなた@Repository

に@Transactionalを追加する必要があります

はあなたのリポジトリにトランザクション・サポートを適用することができます。

+0

テキストを明確にするために私の質問が更新されました。 –

+0

フルコードをアップロードしてください。そして正確にあなたの質問を説明してください – Shanmugapriya

+0

私は問題を渡すまで、私は別のコピー/貼り付けを適用しないように学ぶことについての質問はなぜ@Shanmugapriya、なぜですか、私はそれを準備しています。 –

関連する問題