JPA 保存行为

JPA save behavior

我需要帮助了解 EntityManager.merge() 如何针对现有实体工作。如果重要的话,这与 openJPA 有关。

这是我目前的理解:

  1. 任何时候 创建一个新的 Java 对象至少执行该对象的构造函数之一。
  2. merge() returns 正在保存的对象的新实例

通过调试器观察到的行为是 merge() 不会调用新实例的构造函数。

解释,link 或书籍参考将不胜感激,可以帮助我理解这些问题:

  1. 如何在不调用至少一个为对象定义的构造函数的情况下创建对象?class?
  2. 鉴于 merge() 从不调用构造函数,在合并期间调用构造函数代码的最佳做法是什么?

感谢您花时间思考我的问题!

根据 JPA 规范:

The entity class must have a no-arg constructor. The entity class may have other constructors as well. The no-arg constructor must be public or protected.

因此,无论您在实体中定义了多少个构造函数,唯一会被调用的构造函数是无参数构造函数(没有 arguments/parameters 的构造函数)。您的 JPA 提供程序可能不会通过 new 运算符实例化您的实体,它会使用 Class.newInstance 方法通过反射动态地执行此操作。请参阅下面的示例:

Class clazz = Class.forName("com.test.TestEntity");
clazz.newInstance();

关于合并的问题:合并操作不保证实例化新的实体对象。如果实体已经被管理并且已经存在于持久化上下文中,它就不必创建一个新对象,它只会更新已经存在于持久化上下文中的对象。

如果你想在任何实体被持久化或更新之前执行一些code/logic,不妨考虑使用使用@PrePersist@PreUpdate注解的生命周期回调方法。