我需要帮助了解EntityManager.merge()如何处理现有实体。如果重要的话,这与openJPA有关。
这是我目前的理解:
通过调试器观察到的行为是merge()不会调用新实例的构造函数。
非常感谢解释,链接或书籍参考可以帮助我理解这些问题:
感谢您抽出宝贵时间思考我的问题!
答案 0 :(得分:1)
根据JPA规范:
实体类必须具有无参数构造函数。实体类可以 还有其他建设者。 no-arg构造函数必须是公共的 或受保护。
因此,无论您在实体中定义了多少个构造函数,唯一将被调用的构造函数是no-arg构造函数(不带参数/参数的构造函数)。您的JPA提供程序可能无法通过new
运算符实例化您的实体,它会使用Class.newInstance
方法通过反射动态执行此操作。见下面的示例:
Class clazz = Class.forName("com.test.TestEntity");
clazz.newInstance();
关于合并的问题:合并操作不保证要实例化新的实体对象。如果实体已经被管理并且已经存在于持久化上下文中,则它不必创建新对象,它只会更新持久化上下文中已存在的实体。
如果要在任何实体被持久化或更新之前执行某些代码/逻辑,也可以考虑使用@PrePersist
,@PreUpdate
注释使用生命周期回调方法。