Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用@PrePersist的EntityManager?_Java_Jpa_Jpa 2.0_Eclipselink - Fatal编程技术网

Java 如何使用@PrePersist的EntityManager?

Java 如何使用@PrePersist的EntityManager?,java,jpa,jpa-2.0,eclipselink,Java,Jpa,Jpa 2.0,Eclipselink,我有一个带有此“模式”的“post”实体/表: 所以,表中包含帖子,每个帖子都有多个修订,但只有其中一个(针对每个帖子)是最新的 现在,假设我想对现有帖子进行另一次修订(即更新帖子): 我需要为这个postId找到最高的现有修订ID,增加它并将其设置为修订ID。此外,这是新的当前版本,因此应相应地进行标记,但也应取消标记以前的当前版本 但是我该怎么做呢?我觉得这应该是实体实现的一部分,但另一方面,我需要EntityManager来完成这项工作。但我找不到注入EntityManager实例(保证存

我有一个带有此“模式”的“post”实体/表:

所以,表中包含帖子,每个帖子都有多个修订,但只有其中一个(针对每个帖子)是最新的

现在,假设我想对现有帖子进行另一次修订(即更新帖子):

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

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


可能吗?您如何实现这些场景?谢谢

这可能是传输对象模式的好地方。我们通常这样做:
1.将post实体转换为post传输对象
2.保存帖子后,我们将选择最高的修订ID,增加它并创建一个新实体


或者,您可以更新当前帖子并向历史记录表中添加条目(甚至可以在单独的数据库中)。因此,您可以将post表保持尽可能小以获得更好的性能,因为大多数情况下都需要post的当前版本

不幸的是,对于你的提议,没有一种干净、便携的方式。JPA 2规范()规定了以下内容:

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

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

回调方法不能调用EntityManager或查询方法


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

谢谢。我的解决方案是更改数据库模式,这样就不需要EntityManager了。
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
int id;

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

private Integer revisionId;
private Boolean isCurrentRevision;