我的实体中有几个字段,它们在插入数据库后永远不会改变。
问题:
如果要通过@PrePersist
回调方法设置这些字段,则不会保留这些字段。这是因为EclipseLink首先创建了一个INSERT语句,然后创建了一个UPDATE语句来设置字段,该字段已在回调方法中更改。
在UPDATE语句中,将跳过标有updatable=false
的字段,因此它们永远不会保留在数据库中。
有任何建议如何解决这个问题?
一个非常基本的例子是一些审计日志记录,我想保存我的实体的创建日期,例如。
附加问题: 这是根据JPA规范的预期行为还是EclipseLink特定的?是例如Hibernate以同样的方式处理这个问题?
我正在使用JPA 2.1(EclipseLink 2.6.0)
答案 0 :(得分:0)
我使用hibernate来完成你所描述的内容,我只得到一个insert语句。
我的实体上有这样的东西:
@PrePersist
private void onCreate() {
persistDate = new Date();
}
唯一一次,如果我使用@PostPersist,那么当持久化实体时,我希望插入后跟更新。
我唯一可以想到为什么这不能正确地为eclipselink工作的是eclipselink编织设置以意想不到的方式配置。 See this documentation for more details.
防止对某些字段进行更改的另一种方法是将实体上的setter设为私有。 Hibernate和EclipseLink将能够使用反射设置字段,但它会阻止开发人员更新这些字段。