当在数据库中生成实体的某些非关键字段(例如,通过触发器)时,对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(也许在2.1上)是否可以替换
@Generated
?如果没有,那么处理非关键数据库生成字段的最佳实践是什么? 最佳答案
我从头到尾都阅读了规范,但事实并非如此,与@Generated,对不起和您所说的一样。
GeneratedValue批注可以应用于主键属性
实体或映射超类的字段或字段以及ID
注解。
您可以做的是使用事件监听器@PrePersist和@PreUpdate设置默认情况下的某些属性或由实用程序类生成的属性,然后再持久保存该对象,尝试一下我想到的类似方法。
关于java - JPA等同于Hibernate的@Generated(GenerationTime.ALWAYS),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21838078/