2

我在使用 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 要领正确设置所需的级联规则?

谢谢你的帮助!

4

1 回答 1

1

这不是 DDL 生成的问题,而是删除的问题。

TopLink Essentials 在解决从复杂对象图或循环关系中删除的问题时遇到了一些问题。有一些解决方法,例如先删除依赖对象并调用刷新,然后删除其他对象,或者将外键设置为 null 以便更新它们。使用定制器来标记映射 privateOwned,或者使用约束依赖也可以工作。您还可以删除或推迟约束。

所有删除问题都已在 EclipseLink 中修复,因此升级到最新的 EclipseLink 版本应该可以解决该问题。

EclipseLink 还支持 @CascadeOnDelete 注释以将级联添加到 DDL 生成中的约束。

于 2011-03-30T13:01:46.930 回答