与Hibernate交易代码有关的问题

时间:2019-06-08 11:44:11

标签: java hibernate spring-boot

当我使用休眠模式进行Spring Boot时,我对事务管理代码有些困惑。有人可以澄清我的疑问吗?

public class HibernateConfig {

    @Value("${db.driver-class-name}")
    private String DB_DRIVER;
    @Value("${db.password}")
    private String DB_PASSWORD;
    @Value("${db.url}")
    private String DB_URL;
    @Value("${db.username}")
    private String DB_USERNAME;
    @Value("${hibernate.dialect}")
    private String DB_DIALECT;
    @Value("${hibernate.show_sql}")
    private String DB_SHOW_SQL;
    @Value("${entitymanager.packagesToScan}")
    private String DB_PACAKAGESTOSCAN;

    public DataSource dataSource() {
        DriverManagerDataSource datasources = new DriverManagerDataSource();
        datasources.setDriverClassName(DB_DRIVER);
        datasources.setUrl(DB_URL);
        datasources.setUsername(DB_USERNAME);
        datasources.setPassword(DB_PASSWORD);
        return datasources;
    }

    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionfactory = new LocalSessionFactoryBean();
        sessionfactory.setDataSource(dataSource());
        sessionfactory.setPackagesToScan(DB_PACAKAGESTOSCAN);
        Properties hb_properties = new Properties();
        hb_properties.put("hibernate.dialect", DB_DIALECT);
        hb_properties.put("hibernate.show_sql", DB_SHOW_SQL);
        return sessionfactory;

    }

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

    }

}

在上面的代码中,事务管理器的最后一个方法为什么需要编写?用这种方法,内部发生的事情有人可以向我解释吗?

2 个答案:

答案 0 :(得分:0)

因为休眠需要事务才能执行其操作。例如@OneToMany关系。实体加载后,实际上需要一个活动事务才能获取其惰性关系。仅在活动事务中,实体处于托管状态。

进行以下实验。尝试在没有活动事务的情况下加载具有惰性关系的实体,加载将成功,但是然后尝试访问其中一种关系。

没有活动的事务,您将无法执行简单的保存操作。

答案 1 :(得分:0)

仅基于文档:

  

将Hibernate Session从指定的工厂绑定到线程,   可能每个工厂允许一个线程绑定的会话。

基本上要感谢事务管理器,您能够执行各种CRUD操作并符合ACID数据库规则。

最重要的是:

  

支持自定义隔离级别和超时

然后,如果某些操作仅在获取数据,则可以将事务设置为readOnly,以提高性能。