使用`@ PrePersist`回调不能更改`updatable = false`的字段

时间:2015-09-24 09:51:09

标签: java-ee jpa eclipselink java-ee-7 jpa-2.1

我的实体中有几个字段,它们在插入数据库后永远不会改变。

问题: 如果要通过@PrePersist回调方法设置这些字段,则不会保留这些字段。这是因为EclipseLink首先创建了一个INSERT语句,然后创建了一个UPDATE语句来设置字段,该字段已在回调方法中更改。
在UPDATE语句中,将跳过标有updatable=false的字段,因此它们永远不会保留在数据库中。

  

有任何建议如何解决这个问题?

一个非常基本的例子是一些审计日志记录,我想保存我的实体的创建日期,例如。

附加问题: 这是根据JPA规范的预期行为还是EclipseLink特定的?是例如Hibernate以同样的方式处理这个问题?

我正在使用JPA 2.1(EclipseLink 2.6.0)

1 个答案:

答案 0 :(得分:0)

我使用hibernate来完成你所描述的内容,我只得到一个insert语句。

我的实体上有这样的东西:

@PrePersist
private void onCreate() {
    persistDate = new Date();
}

唯一一次,如果我使用@PostPersist,那么当持久化实体时,我希望插入后跟更新。

我唯一可以想到为什么这不能正确地为eclipselink工作的是eclipselink编织设置以意想不到的方式配置。 See this documentation for more details.

防止对某些字段进行更改的另一种方法是将实体上的setter设为私有。 Hibernate和EclipseLink将能够使用反射设置字段,但它会阻止开发人员更新这些字段。