当在数据库中生成某个实体的某些非密钥字段时(例如,通过触发器),对persist
的调用将不会带回数据库刚刚生成的值。实际上,这意味着您可能需要在refresh
或persist
之后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上)?如果没有,那么处理非关键数据库生成的字段的最佳做法是什么?
答案 0 :(得分:2)
我从头开始直到最后都阅读了这些规格,它不是那样的东西,没有与@Generated相提并论,对不起,就像你说的那样。
GeneratedValue注释可以应用于主键属性 或实体的字段或映射的超类与Id一起使用 注释
你可以做的是使用事件监听器 @PrePersist 和 @PreUpdate 默认设置一些属性,或者在em持久化对象之前由实用程序类生成,尝试这种方法我想到了类似的事情。