注:更新#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);
}
}
テキストを明確にするために私の質問が更新されました。 –
フルコードをアップロードしてください。そして正確にあなたの質問を説明してください – Shanmugapriya
私は問題を渡すまで、私は別のコピー/貼り付けを適用しないように学ぶことについての質問はなぜ@Shanmugapriya、なぜですか、私はそれを準備しています。 –