当我使用休眠模式进行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;
}
}
在上面的代码中,事务管理器的最后一个方法为什么需要编写?用这种方法,内部发生的事情有人可以向我解释吗?
答案 0 :(得分:0)
因为休眠需要事务才能执行其操作。例如@OneToMany关系。实体加载后,实际上需要一个活动事务才能获取其惰性关系。仅在活动事务中,实体处于托管状态。
进行以下实验。尝试在没有活动事务的情况下加载具有惰性关系的实体,加载将成功,但是然后尝试访问其中一种关系。
没有活动的事务,您将无法执行简单的保存操作。
答案 1 :(得分:0)
仅基于文档:
将Hibernate Session从指定的工厂绑定到线程, 可能每个工厂允许一个线程绑定的会话。
基本上要感谢事务管理器,您能够执行各种CRUD操作并符合ACID数据库规则。
最重要的是:
支持自定义隔离级别和超时
然后,如果某些操作仅在获取数据,则可以将事务设置为readOnly
,以提高性能。