可能的对象状态选项
您可能已经注意到,当对象附加到 Hibernate 时,其状态称为Persistent或Managed。怎么对?坚持还是管理?
这是可能的,如此,如此。根据 JPA 规范,对象具有 Persist 状态,而根据 Hibernate 规范,其状态称为 Managed。
在 Hibernate 中,使用数据库是通过org.hibernate.Session类型的对象执行的。根据 JPA,该类应称为 javax.persistence.EntityManager。这并不是什么大问题,因为这两种类型都是接口。
org.hibernate.Session接口声明如下:
interface Session extends java.lang.AutoCloseable, javax.persistence.EntityManager, HibernateEntityManager, QueryProducer, java.io.Serializable, SharedSessionContract {
}
因此, Session接口具有EntityManager接口中的所有方法。但它也有自己的,它是从早期版本的 Hibernate 继承的,当时还没有 JPA 规范。
整个情况描述如下:

让我们看一下会话接口具有的所有方法,以及它们工作的细微差别。
persist() 方法的细微差别
将对象保存到数据库时,需要记住两件事。
首先,保存对象最终会导致执行其中一个 SQL 命令:INSERT 或 UPDATE。其次,这些动作不会在调用对象的方法后立即发生会议,但仅在关闭交易之后。
让我们考虑一些简单的情况,例如,您有一个User类:
@Entity
public class User {
@Id
@GeneratedValue
public Integer id;
@Columnt(name=”user_name”)
public String name;
}
让我们使用persist()方法将其对象保存到数据库中。
User user = new User();
user.setName("Kolyan");
session.persist(user);
此方法的目的是将新对象保存到数据库中。如果还没有这样的对象,那么它将通过调用INSERT SQL 方法添加到数据库中。
如果对象已经在数据库中,则什么也不会发生。但是,第三种情况也是可能的 - 尝试将状态为 Detached 的对象保存到数据库中。在这种情况下,将抛出异常。例子:
User user = new User();
user.setName("Kolyan");
session.persist(user);
session.evict(user); // detach the object from the session
session.persist(user); // a PersistenceException will be thrown here!
save() 方法的细微差别
当前的 Hibernate 的 save() 方法是从其先前版本继承的。它的核心与persist()方法非常相似,它也使用 INSERT 方法向表中添加一条新记录。然而,它有几个有趣的细微差别。
首先,此方法返回一个值——对象的新 ID。如您所知,对象在添加到数据库之前通常没有 ID,并且它已经由数据库分配。因此,会话对象的save()方法返回分配给已保存对象的 ID。
重要的!根据 Hibernate ID 规范,它可以是任何可序列化的对象,而不仅仅是一个数字。它可以是字符串、数字、枚举,以及任何可以完全放入数据库表的一列中的一般内容。
save()方法有一个 Serialized 结果类型,因此它的结果必须转换为正确的类型:
User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);
此外,对于对象的分离状态,save()方法具有不同的行为。它认为这样的对象是新的,并简单地添加另一个条目:
User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);
session.evict(user); // detach the object from the session
Integer id2 = (Integer) session.save(user);
id 和 id2 变量将不同。两条记录将添加到数据库中的表中,每个save()操作一条。
GO TO FULL VERSION