Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我需要了解org.hibernate.HibernateException_Hibernate - Fatal编程技术网

我需要了解org.hibernate.HibernateException

我需要了解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

注意: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 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之间的差异。