Hibernate 关闭自动更新

时间:2022-08-05 11:13:38
    在一个事物里,如果你更新了持久化对象的某个字段,即使你没有显式的调用session.update(obj),
Hibernate的事物管理器也会自动帮你去更新这个对象。如何关闭这种自动update

	@Test
public void test(){
Session session = template.getSessionFactory().openSession();
session.getTransaction().begin();
Person person = (Person )session.get(Person.class, 4L);
person.setName("testName");
session.getTransaction().commit();//事物提交后会自动更新Person 
}

 

3 个解决方案

#1


一个事务当中,一级缓存是直接生效的,当你查询的时候,你使用的是get方法,这个时候会直接发出一条sql将对象的数据查询出来,此时对象就持久化了,当事务提交时,即使你没有显示的去save或者update,对象也会更新到数据库。如果你在当前事务中不想修改查询对象的属性,可以设置事务为只读事务

#2


现在的初步方案是在dao层获取对象之后直接调用session.evict。
此外,请教另外一个问题:
Person对象,id为主键且为自增列
数据库:mysql
Id生成策略:IDENTITY

Person person=new Person();
hibernateTemplate.save(person);
System.out.println(person.getId());


请问Hibernate是如何做到save一条记录后后还能获取到这条记录数据库层面对象的ID。

#3


引用 1 楼 xiaohuashenshou 的回复:
一个事务当中,一级缓存是直接生效的,当你查询的时候,你使用的是get方法,这个时候会直接发出一条sql将对象的数据查询出来,此时对象就持久化了,当事务提交时,即使你没有显示的去save或者update,对象也会更新到数据库。如果你在当前事务中不想修改查询对象的属性,可以设置事务为只读事务


现在的初步方案是在dao层获取对象之后直接调用session.evict。
此外,请教另外一个问题:
Person对象,id为主键且为自增列
数据库:mysql
Id生成策略:IDENTITY

Person person=new Person();
hibernateTemplate.save(person);
System.out.println(person.getId());


请问Hibernate是如何做到save一条记录后后还能获取到这条记录数据库层面对象的ID。 

#1


一个事务当中,一级缓存是直接生效的,当你查询的时候,你使用的是get方法,这个时候会直接发出一条sql将对象的数据查询出来,此时对象就持久化了,当事务提交时,即使你没有显示的去save或者update,对象也会更新到数据库。如果你在当前事务中不想修改查询对象的属性,可以设置事务为只读事务

#2


现在的初步方案是在dao层获取对象之后直接调用session.evict。
此外,请教另外一个问题:
Person对象,id为主键且为自增列
数据库:mysql
Id生成策略:IDENTITY

Person person=new Person();
hibernateTemplate.save(person);
System.out.println(person.getId());


请问Hibernate是如何做到save一条记录后后还能获取到这条记录数据库层面对象的ID。

#3


引用 1 楼 xiaohuashenshou 的回复:
一个事务当中,一级缓存是直接生效的,当你查询的时候,你使用的是get方法,这个时候会直接发出一条sql将对象的数据查询出来,此时对象就持久化了,当事务提交时,即使你没有显示的去save或者update,对象也会更新到数据库。如果你在当前事务中不想修改查询对象的属性,可以设置事务为只读事务


现在的初步方案是在dao层获取对象之后直接调用session.evict。
此外,请教另外一个问题:
Person对象,id为主键且为自增列
数据库:mysql
Id生成策略:IDENTITY

Person person=new Person();
hibernateTemplate.save(person);
System.out.println(person.getId());


请问Hibernate是如何做到save一条记录后后还能获取到这条记录数据库层面对象的ID。