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