Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jakarta ee 无法使用“@PrePersist”回调更改具有“updateable=false”的字段_Jakarta Ee_Jpa_Eclipselink_Java Ee 7_Jpa 2.1 - Fatal编程技术网

Jakarta ee 无法使用“@PrePersist”回调更改具有“updateable=false”的字段

Jakarta ee 无法使用“@PrePersist”回调更改具有“updateable=false”的字段,jakarta-ee,jpa,eclipselink,java-ee-7,jpa-2.1,Jakarta Ee,Jpa,Eclipselink,Java Ee 7,Jpa 2.1,我的实体中有几个字段,这些字段在插入数据库后应该永远不会更改 问题: 如果要通过@PrePersist回调方法设置这些字段,这些字段将不会被持久化。这是因为EclipseLink首先创建一个INSERT语句,然后创建一个UPDATE语句来设置字段,该字段已在回调方法中更改。 在UPDATE语句中,标记为updateable=false的字段将被跳过,因此它们将永远不会保留在数据库中 有什么建议可以解决这个问题吗 一个非常基本的例子是一些审计日志记录,我想保存实体的创建日期,例如 附加问题: 这是

我的实体中有几个字段,这些字段在插入数据库后应该永远不会更改

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

有什么建议可以解决这个问题吗

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

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


我使用的是JPA2.1(EclipseLink 2.6.0)

我使用hibernate来完成您所描述的工作,我只得到一条insert语句

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

@PrePersist
private void onCreate() {
    persistDate = new Date();
}
在持久化实体时,我唯一希望先插入,然后更新的情况是使用@PostPersist

我能想到的唯一一件事是,为什么这不能在eclipselink中正常工作,因为eclipselink编织设置是以一种意外的方式配置的


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

我使用Hibernate来完成您所描述的工作,我只得到一条insert语句

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

@PrePersist
private void onCreate() {
    persistDate = new Date();
}
在持久化实体时,我唯一希望先插入,然后更新的情况是使用@PostPersist

我能想到的唯一一件事是,为什么这不能在eclipselink中正常工作,因为eclipselink编织设置是以一种意外的方式配置的


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

我不完全确定您要完成什么,但在这种情况下,您是否应该使用多态性而不是使用@perperpersist callback覆盖列值?如果没有,请提供一些你正在努力完成的例子。@Jimeh问题中给出了一个简单的例子。让实体有一个类型为
java.util.Date
的字段,我想在这里保存创建实体的时间点。现在我想确保以后不能(意外地)更改此值,因此我想将此字段标记为
updateable=false
。但这导致了问题中提到的问题。我不完全确定您试图实现什么,但在这种情况下,您是否应该使用多态性而不是使用@PerPersist callback覆盖列值?如果没有,请提供一些你正在努力完成的例子。@Jimeh问题中给出了一个简单的例子。让实体有一个类型为
java.util.Date
的字段,我想在这里保存创建实体的时间点。现在我想确保以后不能(意外地)更改此值,因此我想将此字段标记为
updateable=false
。但这导致了问题中提到的问题。