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

Ant*_*oly 5 java jpa

当数据库中生成实体的某些非关键字段时(例如,通过触发器),调用persist将不会带回数据库刚刚生成的值。实际上,这意味着您可能需要或refresh之后的实体(当启用 2 级缓存时,您甚至可能需要该实体)。persistmergeevict

@GeneratedHibernate 有一个处理生成属性的自定义注释。

// 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;
Run Code Online (Sandbox Code Playgroud)

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

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

Koi*_*oer 5

我从头到尾阅读了规范,但事实并非如此,与 @Generate 没有任何可比性,抱歉,正如您所说。

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

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

  • 我很担心:(。不幸的是,触发器可能很复杂并且以数据为中心。即使我可以禁用触发器(而且我不能),将这种逻辑移动到应用程序也会很痛苦。我猜我是坚持手动刷新。 (2认同)