可能的对象状态选项

您可能已经注意到,当对象附加到 Hibernate 时,其状态称为PersistentManaged。怎么对?坚持还是管理?

这是可能的,如此,如此。根据 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()操作一条。