我需要了解org.hibernate.HibernateException
注意:Update#1和Update#2有UserDAOImpl.java、HibernateConfig.java和UserServiceImpl.java我需要了解org.hibernate.HibernateException,hibernate,Hibernate,注意:Update#1和Update#2有UserDAOImpl.java、HibernateConfig.java和UserServiceImpl.java @Component public class UserDAOImpl implements UserDAO { @Autowired private SessionFactory sessionFactory; // Works well @Override public User findB
@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();
}
}
@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;
}
}
@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);
}
}
靠近点
正如我所知,您需要从Hibernate SessionFactory获得事务。
在使用getCurrentSession()获取会话后运行查询将无法工作,直到您完成事务处理。
所以,在@Repository或@Service上使用@Transactional可以让spring为其方法的查询应用事务
为什么entityManager不需要事务,我将深入探讨
我需要知道阅读什么才能理解此异常的含义:
org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
我知道有些答案建议@EnableTransactionManagement,有些答案建议@Transactional,我现在将复制/粘贴解决方案
我是一个非常基础的用户,我不太了解RDBMS,我知道如何处理MySQL的基本知识,所以如果你能列出一些主题来阅读就足够了
更新#1
我有两个查询,一个正常,另一个异常,我的任何服务类上都没有@Transactional:
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();
}
}
@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;
}
}
@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);
}
}
这就是为什么我需要更多的阅读而不是复制粘贴,我不应该给-1,我需要好好学习
更新#2
HibernateConfig.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();
}
}
@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;
}
}
@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);
}
}
UserServiceImpl.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();
}
}
@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;
}
}
@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);
}
}
您必须启用事务支持(或@EnableTransactionManagement)并声明transactionManager,它应该通过SessionFactory工作 您必须将@Transactional添加到@Repository中
通过@Repository中的@Transactional,Spring可以将事务支持应用到您的存储库中。请上传完整代码。并正确解释你的问题lyokay@Shanmugapriya,这就是关于学习的问题的原因,这样我就不会应用不同的复制/粘贴,直到我通过了问题,我正在准备。参考以下url。您可能会对该错误有所了解,但如果您想说createEntityManager执行了beginTransaction,我想我需要消除entity manager和sessionUserDAOImpl.java、HibernateConfig.java、UserServiceImpl.java之间的差异。