当在数据库中生成实体的某些非关键字段(例如,通过触发器)时,对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(也许在2.1上)是否可以替换@Generated?如果没有,那么处理非关键数据库生成字段的最佳实践是什么?

最佳答案

我从头到尾都阅读了规范,但事实并非如此,与@Generated,对不起和您所说的一样。


  GeneratedValue批注可以应用于主键属性
  实体或映射超类的字段或字段以及ID
  注解。


您可以做的是使用事件监听器@PrePersist和@PreUpdate设置默认情况下的某些属性或由实用程序类生成的属性,然后再持久保存该对象,尝试一下我想到的类似方法。

关于java - JPA等同于Hibernate的@Generated(GenerationTime.ALWAYS),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21838078/

10-12 04:50