Java中Hibernate的状态总结
Hibernate是Java中广泛使用的ORM(对象关系映射)框架之一,其核心原则是使用Java对象来映射数据库表格。在使用Hibernate时,需要注意对象实例所处的状态,本文将对Hibernate中的状态进行总结。
Hibernate对象状态
下面是Hibernate对象可能出现的几种状态:
- Transient状态
Transient状态表示一个对象刚刚被创建,还没有被关联到数据库记录上。此时对象实例并不受Hibernate的管理控制,也不会被持久化到数据库。可以使用new关键字来创建Transient状态的对象,例如:
Book book = new Book();
book.setTitle("Spring in Action");
book.setAuthor("Craig Walls");
book.setIsbn("978-1617294945");
在上面的例子中,book实例是一个Transient状态的对象。
- Persistent状态
Persistent状态表示一个对象已经被和数据库记录关联上了,并且Hibernate正在跟踪该对象的状态。在持久化上下文中,Hibernate维护一个包含所有Persistent状态对象的缓存,这些对象在持久化上下文中是唯一的,并且由Hibernate来管理其状态。可以使用Hibernate的save()、persist()等方法将Transient状态的对象转变为Persistent状态的对象,例如:
Session session = HibernateUtil.getSessionFactory().openSession();
Book book = new Book();
book.setTitle("Hibernate in Action");
book.setAuthor("Christian Bauer, Gavin King");
book.setIsbn("978-1932394-58-8");
Transaction tx = session.beginTransaction();
session.save(book);
tx.commit();
session.close();
在上面的例子中,在调用session的save()方法后,book对象就变成了Persistent状态对象。由于该对象受Hibernate的管理控制,所以对该对象的任何更改都将自动同步到数据库中。
- Detached状态
Detached状态表示一个对象曾经是Persistent状态,并且和数据库记录关联,但是已经脱离Hibernate的管理控制,如在一个已经关闭的Session中获取的持久化对象。在Detached状态下,对象和数据库记录之间的同步已经失去,无法自动将对象的状态同步到数据库中。如下面的例子,我们从一个当前的Session中获取一个Book对象,然后关闭该Session:
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
Book book = (Book) session.get(Book.class, 1L);
tx.commit();
session.close();
在上面的例子中,book对象曾经是Persistent状态对象,但是当Session关闭后,该对象就变成了Detached状态对象。
- Removed状态
Removed状态表示一个曾经是Persistent状态的对象将被从数据库中删除。使用session的delete()方法可以将一个Persistent状态的对象变成Removed状态的对象,并将其标记为待删除。这个对象依然受Hibernate控制,处于Removed状态的对象能够被rollback回原来的状态。例如:
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
Book book = (Book) session.get(Book.class, 1L);
session.delete(book);
tx.commit();
session.close();
在上述例子中,book对象现在处于Removed状态,等到调用session的flush()方法后将会被从数据库中删除。
总结
总之,在使用Hibernate时,需要清楚地知道对象实例所处的状态,避免出现错误的操作。在实际使用时,应该合理的使用对象状态以及Hibernate的持久性上下文来增加程序的效率和稳定性。
示例
下面是一个简单的示例程序,演示了Hibernate对象的状态变化过程。在该程序中,我们创建了一个Book实体类,并通过Hibernate的save()方法和update()方法,演示了Transient状态变为Persistent状态,以及Persistent状态变为Detached状态再变为Persistent状态的情景。代码如下:
public class Book {
private Long id;
private String title;
private String author;
private String isbn;
//...省略getter和setter方法
public static void main(String[] args) {
Book book = new Book();
book.setTitle("Thinking in Java");
book.setAuthor("Bruce Eckel");
book.setIsbn("978-0136597230");
//Transient状态
System.out.println("#### 1. Transient状态 ####");
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
session.save(book);
Long id = book.getId();
tx.commit(); //Persistent状态
session.close();
System.out.println("#### 2. Persistent状态 ####");
session = HibernateUtil.getSessionFactory().openSession();//从SessionFactory获取一个新的Session
tx = session.beginTransaction();
book.setTitle("Thinking in C++");
session.update(book);
tx.commit(); //Detached状态
session.close();
System.out.println("#### 3. Detached状态 ####");
session = HibernateUtil.getSessionFactory().openSession();
tx = session.beginTransaction();
book.setTitle("Thinking in Python");
session.update(book); //Detached状态转变为Persistent状态
tx.commit();
session.close();
HibernateUtil.shutdown();
}
}
在上面的示例代码中,我们分别创建了Transient状态的book对象,使用session的save()方法将其保存到数据库中,这时book对象变为了Persistent状态。然后我们重新创建了一个新的Session,通过session的update()方法更新book对象的title属性,并commit事务,这时book对象的状态变为Detached,已经脱离了Hibernate的管理控制。最后,我们又一次使用session的update()方法将book对象再次变成了Persistent状态,通过commit()方法将保存到数据库中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java中Hibernate的状态总结 - Python技术站