JPA 级联来自多个persistenceUnits 的实体

Posted

技术标签:

【中文标题】JPA 级联来自多个persistenceUnits 的实体【英文标题】:JPA cascade on entities from multiple persistenceUnits 【发布时间】:2015-02-09 15:00:20 【问题描述】:

我在两个实体之间存在单向关系:

*@Entity
public class XXX
  @Id
  private Long Id;
  @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
  @JoinColumn(name = "YYY_ID")
  private YYY yyy;

@Entity
public class YYY
   @Id
   private Long Id;

   private String someName;
*

实体属于同一个数据库中的不同模式(但我可能不使用同义词,或者授予模式...),所以我有两个持久性单元:

1.persistenceUnit(xxx) - 实体 xxx 被映射到那里

2.persistenceUnit(yyy) - 实体 yyy 映射到那里

我可以让 jpa 在另一个持久性单元上自动执行级联吗? 示例:

@PersistenceContext(unitName = "xxx")
private EntityManager em;

XXX xxx = new XXX();
YYY yyy = new YYY();
yyy.setSomeName("just some name"):
xxx.setYYY(yyy);
em.persist(xxx);

这应该创建两个对象...

有可能吗?帮助表示赞赏。我在 Jboss7 上使用 JPA2、Hibernate 4

【问题讨论】:

【参考方案1】:

JPA 规范不要求支持跨多个持久单元的映射。

但是,您可以根据您的数据库权限,使用一个持久性单元并使用 @Table 注释为不在默认架构中的任何实体指定方案/目录。

@Entity
@Table(schema="xyz")
public class XXX
  @Id
  private Long Id;
  @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
  @JoinColumn(name = "YYY_ID")
  private YYY yyy;

否则,您将需要在数据库级别寻找解决方案或考虑使用特定于提供程序的解决方案:我不知道 Hibernate 的任何内容,但请参阅以下 EclipseLink 功能:

https://wiki.eclipse.org/EclipseLink/Examples/JPA/Composite

从 EclipseLink 2.3.0 开始 JPA 开发人员现在可以结合 持久性单元在运行时一起允许存储实体 在不同的数据库中。 这包括对关系的支持 不同持久性单元中的实体之间(跨 数据库)

【讨论】:

不,我不能,正如我之前所说:实体属于同一个数据库中的不同模式(但我可能不使用同义词,或者授予模式......)。所以一个模式看不到另一个。

以上是关于JPA 级联来自多个persistenceUnits 的实体的主要内容,如果未能解决你的问题,请参考以下文章

JPA 2.0:自动将实体类*从不同的 jar* 添加到 PersistenceUnit

使用Spring时如何注入多个JPA EntityManager(持久化单元)

你好! jpa里不能级联删除。我看你在百度知道里已经解决了这个问题。请问,是怎么解决的!谢谢

异常[PersistenceUnit: default] Unable to build Hibernate SessionFactory

Hibernate JPA 关联关系

JPA:OptimisticLockException 和级联