java - 如何使用@PrePersist 的 EntityManager?

标签 java jpa jpa-2.0 eclipselink

我有这个“架构”的“发布”实体/表:

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

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

private Integer revisionId;
private Boolean isCurrentRevision;

因此,表格包含帖子,每个帖子都有多个修订版,但只有其中一个(对于每个帖子)是最新的。

现在,假设我想保留现有帖子的另一个修订版(即更新帖子):

我需要为这个 postId 找到最高的现有 revisionId,增加它并将它设置为 revisionId。此外,这是新的当前修订版,因此应相应地进行标记,但以前的当前修订版也应取消标记。

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

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

最佳答案

不幸的是,对于您提出的建议,没有干净、便携的方法。 JPA 2 规范 ( JSR 317 ) 声明如下:

In general, the lifecycle method of a portable application should not invoke EntityManager or Query operations, access other entity instances, or modify relationships within the same persistence context.

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

A callback method must not invoke EntityManager or Query methods!

我知道这不是您真正希望的,但看来您必须将修订管理责任分配给实体类的客户。

关于java - 如何使用@PrePersist 的 EntityManager?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5267408/

相关文章:

java - 从 IVY 存储库中删除孤立 JAR

java - 使用 ImageIO 发送图像后从 ImageIO 读取图像时出现未知字节

java - 在 Java 调试 session 期间查找大字符串分配

java - Hibernate 枚举映射

java - Hibernate从子实体获取父实体的id

java - VM初始化期间发生错误,无法为对象堆保留足够的空间

mysql - hibernate + MySQL : How to set the encoding utf-8 for database and tables

java - 通过restcontroller执行实体时不会保存实体

sql - Hibernate 创建、不更新、不删除。

java - JPA 中更好的异常处理