如何从@PrePersist使用EntityManager?

Tom*_*mik 2 java jpa eclipselink jpa-2.0

我用这个"架构""发布"实体/表:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
int id;

@GeneratedValue(strategy = GenerationType.AUTO)
private Integer postId;

private Integer revisionId;
private Boolean isCurrentRevision;
Run Code Online (Sandbox Code Playgroud)

因此,表包含帖子,每个帖子都有多个修订,但只有它们(对于每个帖子)是最新的.

现在,假设我想继续修改现有帖子(即更新帖子):

我需要为这个postId找到最高的现有revisionId,增加它并将其设置为revisionId.这也是新的当前版本,因此应该相应地进行标记,但前一个当前版本也应该没有标记.

但是我怎么能这样做呢?我觉得这应该是实体实现的一部分,但另一方面我需要EntityManager来做到这一点.但我找不到注入EntityManager实例的方法(保证存在).

可能吗?你如何实现这样的场景?谢谢!

Voj*_*vic 5

不幸的是,没有干净,便携的方式来达到您的建议.JPA 2规范(JSR 317)声明如下:

通常,可移植应用程序的生命周期方法不应调用EntityManager或Query操作,访问其他实体实例或修改同一持久性上下文中的关系.

就实现而言,Hibernate明确禁止它:

回调方法不能调用EntityManager或Query方法!

我知道这并不是你所希望的,但似乎你必须将修订管理职责分配给你的实体类的客户.