Hibernate是一个Java语言的ORM(Object-Relational Mapping)框架,用来方便地进行数据库操作。在Hibernate中,每一个对象都有它自己的状态,状态对Hibernate来说非常重要。Hibernate中的实体状态一共有三种,他们是瞬时态、持久态、游离态,下面让我们详细来解释一下这三种状态。
瞬时态
瞬时态是指,一个对象未被持久化的状态,即我们通过new关键字创建了一个新的对象,但还没有将它持久化到数据库中。这种状态的对象没有与数据库中的任何记录产生关联,当我们调用session.save()
进行持久化操作之后,该对象就会从瞬时态转换到持久态。
示例1:创建新的Person对象并持久化到数据库
Person person = new Person(); // 创建了一个新的Person对象
person.setName("Tom");
person.setAge(18);
session.save(person); // 将该对象持久化到数据库中
示例2:从数据库中读取一个对象并修改其属性值
Person person = session.get(Person.class, 1); // 从数据库中读取id为1的Person对象
person.setName("Jack"); // 修改对象属性值
在示例2中,虽然我们对person对象进行了属性的修改,但是由于该对象是从数据库中读取出来的持久态对象,所以当我们调用session的flush()方法后,Hibernate会自动将修改后的属性值同步到数据库中。
持久态
持久态是指,一个对象已经被保存到数据库中并与数据库中的记录关联起来的状态。这种状态的对象被Session进行管理,并且在Session缓存中有相应的记录。当我们修改了该对象的属性时,Hibernate会为我们自动更新数据库中对应的记录。
示例1:从数据库中读取一个对象并修改其属性值
Person person = session.get(Person.class, 1); // 从数据库中读取id为1的Person对象
person.setName("Jack"); // 修改对象属性值
在示例1中,我们从数据库中读取出id为1的Person对象,并且修改了它的姓名属性,由于该对象是持久态对象,Hibernate会为我们自动更新数据库中对应的记录。
示例2:将对象从持久态变为游离态
Person person = session.get(Person.class, 1); // 从数据库中读取id为1的Person对象
session.evict(person); // 将该对象从Session缓存中清除,并且变为游离态对象
在示例2中,我们通过调用Session的evict()方法,将对象person从Session缓存中清除,并且将其变为游离态对象。此时该对象已经与Session失去了关联,对该对象的任何操作都不会被Hibernate自动进行同步到数据库中。
游离态
游离态是指,一个对象已经被持久化到数据库中,但是它已经不被Session所管理的状态。当我们从Session缓存中将持久态对象清除时,它就会变成游离态对象。此时该对象已经与Session失去了关联,对该对象的任何操作都不会被Hibernate自动进行同步到数据库中。当我们再次将该对象重新与Session关联起来时,该对象变成持久态对象。
示例1:将对象从持久态变为游离态
Person person = session.get(Person.class, 1); // 从数据库中读取id为1的Person对象
session.evict(person); // 将该对象从Session缓存中清除,并且变为游离态对象
在示例1中,我们通过调用Session的evict()方法,将对象person从Session缓存中清除,并且将其变为游离态对象。此时该对象已经与Session失去了关联,对该对象的任何操作都不会被Hibernate自动进行同步到数据库中。
示例2:将游离态对象重新变为持久态对象
Person person = new Person(); // 创建一个新的Person对象
person.setId(1); // 设置该对象的id属性
person.setName("Tom"); // 设置该对象的name属性
person.setAge(18); // 设置该对象的age属性
session.update(person); // 将该对象重新与Session建立关联,并将其更新到数据库中
在示例2中,我们创建了一个新的Person对象,并且将其设置为游离态对象。接着,我们通过调用Session的update()方法,将该对象重新与Session建立关联,并且将其更新到数据库中,此时该对象变成持久态对象。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:hibernate 三种状态的转换 - Python技术站