Управление генерацией DDL в Toplink Essentials - PullRequest
2 голосов
/ 30 марта 2011

У меня возникли проблемы с DDL-поколением Toplink Essentials.Я занимаюсь разработкой приложения на основе Glassfish 2.1 и использую JPA для обеспечения устойчивости.

У меня есть граф объектов, в котором родительский объект класса A владеет набором объектов класса B. Объекты B бывают нескольких разновидностей, которые моделируются с использованием наследования.Одним из таких вариантов является составной объект класса BC, который объединяет множество других объектов B.Все объекты B в BC также должны принадлежать тому же объекту A, что и B. Обратите внимание, что не все объекты B объекта A должны быть частью составного BC, они также могут быть автономными.

в основном это соответствует следующим классам:

@Entity
class A {
  @ManyToOne(mappedBy="owner", cascade = { CascadeType.PERSIST, CascadeType.REMOVE })
  Set<B> bs;
}

@Entity
@Inheritance
abstract class B {
  @Id
  long id;

  @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.REMOVE })
  A owner;

  @ManyToOne(optional = true)
  BC composite;
}

@Entity
class BC extends B {
  @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.REMOVE }, mappedBy = "composite")
  Set<B> parts;
}

Когда toplink генерирует DDL для этой иерархии объектов, она создает все ограничения внешнего ключа, как и ожидалось.Однако он не устанавливает каскадные правила для ограничений.

Когда я сейчас пытаюсь удалить весь граф объектов через ссылку на экземпляр A, могут возникнуть ситуации, когда toplink не сможет правильно удалить граф из базы данных.Когда toplink удаляет объект BC перед удалением содержащихся объектов B, ограничение внешнего ключа для «составного» отношения нарушается.

Эта ситуация может быть исправлена ​​путем ручной настройки сгенерированного DDL для CASCADE (или SET NULL) насоответствующее ограничение внешнего ключа, что хорошо для производственной среды.Это, однако, дает сбой в тестовой среде с базами данных в памяти (Derby), где генерация DDL полностью управляется основами toplink и, таким образом, приводит к нарушению ограничения, описанному выше.

Есть ли способ повлиять на процесс генерации DDLтак, чтобы требуемые правила каскадирования были правильно установлены основными элементами toplink?

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 30 марта 2011

Это не проблема с генерацией DDL, а с удалением.

У TopLink Essentials были некоторые проблемы с разрешением удалений из графов сложных объектов или циклических связей.Есть несколько обходных путей, таких как сначала удаление зависимых объектов и вызов flush, затем удаление других объектов или установка внешнего ключа в значение null, чтобы они обновлялись.Использование настройщика для отметки сопоставления privateOwned или воспроизведения с зависимостью ограничения также может работать.Вы также можете удалить или отложить ограничения.

Все проблемы удаления были исправлены в EclipseLink, поэтому обновление до последней версии EclipseLink должно решить проблему.

EclipseLink также поддерживает @CascadeOnDeleteаннотация для добавления каскада к ограничению при генерации DDL.

...