Java JPA相当于Hibernate';s@Generated(GenerationTime.ALWAYS)

Java JPA相当于Hibernate';s@Generated(GenerationTime.ALWAYS),java,jpa,Java,Jpa,当在数据库中生成实体的某些非键字段时(例如,通过触发器),调用持久化将不会返回数据库刚刚生成的值。实际上,这意味着您可能需要在持久化或合并之后刷新一个实体(当启用二级缓存时,您甚至可能需要退出该实体) Hibernate有一个自定义注释来处理 JPA仅适用于主键属性 所以,我的问题是,是否有JPAAPI(可能是2.1)上的@Generated的替代品?如果没有,处理非关键数据库生成字段的最佳实践是什么?我从头到尾都在阅读规范,但它不是这样的东西,与@generated没有任何可比性,抱歉,正如你

当在数据库中生成实体的某些非键字段时(例如,通过触发器),调用
持久化
将不会返回数据库刚刚生成的值。实际上,这意味着您可能需要在
持久化
合并
之后
刷新
一个实体(当启用二级缓存时,您甚至可能需要
退出该实体)

Hibernate有一个自定义注释来处理

JPA仅适用于主键属性


所以,我的问题是,是否有JPAAPI(可能是2.1)上的
@Generated
的替代品?如果没有,处理非关键数据库生成字段的最佳实践是什么?

我从头到尾都在阅读规范,但它不是这样的东西,与@generated没有任何可比性,抱歉,正如你所说

GeneratedValue注释可应用于主键属性 或实体或映射超类的字段与Id一起使用 注释


您可以使用事件侦听器@PrePersist@PreUpdate设置默认属性或在em持久化对象之前由实用程序类生成的属性,尝试这种方法。我想到类似的方法。

只是好奇,但是,为什么需要为字段生成值?主要是因为触发器会修改非键列。我需要这些值,am希望消除手动刷新(有时逐出)刚刚保存的实体的负担。我担心是这样的:(.不幸的是,触发器可能很复杂且以数据为中心。即使我可以禁用触发器(但我不能),将这种逻辑转移到应用程序将是一件痛苦的事情。我想我必须手动刷新。
// Refresh property 1 on insert and update
@Generated(GenerationTime.ALWAYS) 
@Column(insertable = false, updatable = false)
private String property1;

// Refresh property 2 on insert
@Generated(GenerationTime.INSERT) 
@Column(insertable = false)
private String property2;