Управление генерацией DDL в Toplink Essentials

У меня возникли проблемы с генерацией 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 полностью управляется основными элементами топлинков и, таким образом, приводит к описанному выше нарушению ограничений.

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

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


person Alex Stockinger    schedule 30.03.2011    source источник


Ответы (1)


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

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

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

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

person James    schedule 30.03.2011