我在使用 Toplink Essentials 的 DDL 生成时遇到了一些问题。我正在开发一个基于 Glassfish 2.1 的应用程序并使用 JPA 进行持久性。
我有一个对象图,其中 A 类的父实体拥有 B 类的一组实体。实体 B 有几种使用继承建模的风格。一种这样的风格是组合实体类 BC,它捆绑了一组其他几个 B 实体。BC 中的所有实体 B 也必须由与 B 相同的实体 A 拥有。请注意,并非实体 A 的所有实体 B 都必须是复合 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 在删除包含的 B 实体之前删除 BC 实体时,违反了“复合”关系的外键约束。
这种情况可以通过手动将生成的 DDL 调整为适用于生产环境的相关外键约束的 CASCADE(或 SET NULL)来纠正。然而,这在具有内存 (Derby) 数据库的测试环境中失败,其中 DDL 生成完全由 toplink 要素管理,因此导致上述约束违规。
有什么方法可以影响 DDL 生成过程,以便 toplink 要领正确设置所需的级联规则?
谢谢你的帮助!