当我使用 hibernate 进行 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;
}
}
那么在上面的代码中为什么我们需要编写事务管理器的最后一个方法呢?在这种方法中,内部发生了什么,有人可以解释一下吗?
最佳答案
因为 hibernate 需要事务才能执行其操作。示例是@OneToMany 关系。加载实体后,您实际上需要一个 Activity 事务才能获取其惰性关系。仅在 Activity 事务中,实体才处于托管状态。
做如下实验。尝试在没有 Activity 事务的情况下加载具有惰性关系的实体,加载将成功,但随后尝试访问其中一个关系。
如果没有 Activity 事务,您将无法执行简单的保存操作。
关于java - 与Hibernate事务代码相关的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56506034/