JPA 保存行为
JPA save behavior
我需要帮助了解 EntityManager.merge() 如何针对现有实体工作。如果重要的话,这与 openJPA 有关。
这是我目前的理解:
- 任何时候 创建一个新的 Java 对象至少执行该对象的构造函数之一。
- merge() returns 正在保存的对象的新实例
通过调试器观察到的行为是 merge() 不会调用新实例的构造函数。
解释,link 或书籍参考将不胜感激,可以帮助我理解这些问题:
- 如何在不调用至少一个为对象定义的构造函数的情况下创建对象?class?
- 鉴于 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
注解的生命周期回调方法。
我需要帮助了解 EntityManager.merge() 如何针对现有实体工作。如果重要的话,这与 openJPA 有关。
这是我目前的理解:
- 任何时候 创建一个新的 Java 对象至少执行该对象的构造函数之一。
- merge() returns 正在保存的对象的新实例
通过调试器观察到的行为是 merge() 不会调用新实例的构造函数。
解释,link 或书籍参考将不胜感激,可以帮助我理解这些问题:
- 如何在不调用至少一个为对象定义的构造函数的情况下创建对象?class?
- 鉴于 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
注解的生命周期回调方法。