【问题标题】:Controlling DDL generation in Toplink Essentials在 Toplink Essentials 中控制 DDL 生成
【发布时间】:2011-03-30 21:01:46
【问题描述】:

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

感谢您的帮助!

【问题讨论】:

    标签: jpa jakarta-ee constraints cascade toplink


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-10-07
      • 2011-05-14
      • 2010-10-26
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 2017-08-04
      相关资源
      最近更新 更多