Каскад JPA для сущностей из нескольких persistenceUnits

У меня есть однонаправленная связь между двумя объектами:

*@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);

Это должно создать два объекта...

Является ли это возможным? Помощь приветствуется. Я использую JPA2, Hibernate 4 на Jboss7


person cage    schedule 09.02.2015    source источник


Ответы (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-разработчики теперь могут объединять блоки сохраняемости во время выполнения, что позволяет хранить объекты в разных базах данных. Это включает поддержку отношений между сущностями в разных единицах сохраняемости (ссылки между базами данных).

person Alan Hay    schedule 09.02.2015
comment
нет, я не могу, как я уже говорил: объекты принадлежат к разным схемам в одной и той же базе данных (но я не могу использовать синонимы или давать гранты схеме...). Так что одна схема не видит другую. - person cage; 09.02.2015