spring-boot - 为什么休眠在没有事务的情况下保存值?
问题描述
我正在使用带有休眠(5.3.9)的弹簧靴(2.1.4)。
public class BaseDao{
@Autowired
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Autowired
private EntityManagerFactory entityManagerFactory;
@PersistenceContext
private EntityManager entityManager;
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public EntityManagerFactory getEntityManagerFactory() {
return entityManagerFactory;
}
public EntityManager getEntityManager() {
return entityManager;
}
public Session getSession() throws Exception{
if(session == null) {
session = getSessionFactory().openSession();
}
if(transaction == null) {
transaction = session.beginTransaction();
}
return session;
}
public void commit() throws Exception{
if(transaction != null) {
transaction.commit();
transaction = null;
}
if(session != null) {
session.close();
session = null;
}
}
public void rollback() throws Exception{
if(transaction != null) {
transaction.rollback();
transaction = null;
}
if(session != null) {
session.close();
session = null;
}
}
protected void save(Object object) throws Exception {
getSessionFactory().openSession().save(object); //saves data in db
getSession().save(object); //is not saving data
}
getSessionFactory().openSession().save(object); 即使没有提交getSession().save(object);此代码也将数据保存到数据库 ;此代码需要在创建 txn 但未提交时调用提交
休眠日志
我在下面的日志中看到了这两行代码
插入 TEST_ENTITY (CREATED_BY, CREATED_DATE, ENABLED, LAST_MODIFIED_BY, LAST_MODIFIED_DATE, NAME) 值 (?, ?, ?, ?, ?, ?)
我对这种行为没有几个问题。
我知道没有提交就不会发生写操作,所以知道这里有什么问题或在第一种情况下导致提交的原因是什么?
可以使用上面的代码,即第一个场景吗?
如果第一种方法不正确,那么我是否需要为每个对象创建并提交 txn,任何更好的方法,这样即使我必须提交 txn,我也不想在每个新方法中复制 txn.commit()写在 BaseDao.java 中,即说我有 create()、update()、delete() 方法我可以把这个 txn.commit() 移出方法吗?
很少有地方我使用 spring data jpa 来获取/保存记录(如下所示),在 spring data jpa 中如何处理 txn?任何参考?
@Repository 公共接口 TestEntitytRepo 扩展 JpaRepository<TestEntity, Long> { ... }
如果我错过了要在此处捕获的任何详细信息,请告诉我。
提前致谢。
解决方案
在 hibernate 中,Save() 方法将对象存储到数据库中。它将持久化给定的瞬态实例,首先分配一个生成的标识符。它返回创建的实体的 id。当使用 SessionFactory.openSession() 创建 hibernate 中的会话时,不会创建任何事务,因此所有操作都在事务上下文之外执行!为了确保将数据保存到数据库中,需要创建一个新事务。
我对你上面解释的行为有点怀疑。似乎启用了自动提交选项。如果是这样,那么这不是问题,因为 save() 方法已完成,后台自动提交!
推荐阅读
- android - Android 视图的复杂弯曲背景
- angular - Angular&rxjs:自动完成竞争条件问题
- java - 模拟 int 数据类型的 @value 注释
- hive - 使用 Struct 字段将 Qubole Hive 表同步到 Snowflake
- amazon-web-services - 成功部署后未部署 AWS C# Lambda 函数代码
- typescript - 如何在 vanilla Typescript Nativescript 中创建共享服务(作为 Angular 服务)
- javascript - javascript 使用 typedArray 访问内存映射
- python - 如何在函数内部传递字典语句
- c# - 尝试从 Azure Function V2 调用第三方 dll 时出现异常
- excel - 修剪一些单元格包含空格,一些包含公式的数据