JPA相当于Hibernate的@Generated(GenerationTime.ALWAYS)

时间:2014-02-17 19:50:47

标签: java jpa

当在数据库中生成某个实体的某些非密钥字段时(例如,通过触发器),对persist的调用将不会带回数据库刚刚生成的值。实际上,这意味着您可能需要在refreshpersist之后merge实体(当启用第2级缓存时,您甚至可能需要evict实体)。

Hibernate有一个自定义注释@Generated,可以处理Generated Properties

// 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;

JPA @GeneratedValue仅适用于主键属性。

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

1 个答案:

答案 0 :(得分:2)

我从头开始直到最后都阅读了这些规格,它不是那样的东西,没有与@Generated相提并论,对不起,就像你说的那样。

  

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

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