JPA保存行为

时间:2015-10-11 22:30:47

标签: jpa openjpa

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

这是我目前的理解:

  1. 任何时候创建一个新的Java对象,至少执行该对象的一个​​构造函数。
  2. merge()返回正在保存的对象的新实例
  3. 通过调试器观察到的行为是merge()不会调用新实例的构造函数。

    非常感谢解释,链接或书籍参考可以帮助我理解这些问题:

    1. 如何在不调用为该类定义的至少一个构造函数的情况下创建对象?
    2. 鉴于merge()从不调用构造函数,在合并期间调用构造函数代码的最佳实践是什么?
    3. 感谢您抽出宝贵时间思考我的问题!

1 个答案:

答案 0 :(得分:1)

根据JPA规范:

  

实体类必须具有无参数构造函数。实体类可以   还有其他建设者。 no-arg构造函数必须是公共的   或受保护。

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

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

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

如果要在任何实体被持久化或更新之前执行某些代码/逻辑,也可以考虑使用@PrePersist@PreUpdate注释使用生命周期回调方法。