У меня возникли проблемы с генерацией 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?
Спасибо за вашу помощь!