Jpa 在Toplink Essentials中控制DDL生成
我在Toplink Essentials的DDL生成方面遇到了一些问题。我正在开发一个基于GlassFish2.1的应用程序,并使用JPA实现持久性 我有一个对象图,其中类a的父实体拥有一组类B的实体。实体B有几种风格,使用继承进行建模。一个这样的风格是组合实体类BC,它将一组其他B实体捆绑在一起。BC中的所有实体B也必须与B属于同一实体a。请注意,并非实体a的所有实体B都必须是复合BC的一部分,它们也可以是独立的 基本上,这映射到以下类:Jpa 在Toplink Essentials中控制DDL生成,jpa,jakarta-ee,constraints,cascade,toplink,Jpa,Jakarta Ee,Constraints,Cascade,Toplink,我在Toplink Essentials的DDL生成方面遇到了一些问题。我正在开发一个基于GlassFish2.1的应用程序,并使用JPA实现持久性 我有一个对象图,其中类a的父实体拥有一组类B的实体。实体B有几种风格,使用继承进行建模。一个这样的风格是组合实体类BC,它将一组其他B实体捆绑在一起。BC中的所有实体B也必须与B属于同一实体a。请注意,并非实体a的所有实体B都必须是复合BC的一部分,它们也可以是独立的 基本上,这映射到以下类: @Entity class A { @ManyTo
@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;
}
@实体
甲级{
@manytone(mappedBy=“owner”,cascade={CascadeType.PERSIST,CascadeType.REMOVE})
设置bs;
}
@实体
@继承权
抽象B类{
@身份证
长id;
@manytone(cascade={CascadeType.PERSIST,CascadeType.REMOVE})
业主;
@多通(可选=真)
BC复合材料;
}
@实体
BC类扩展了B类{
@OneToMany(cascade={CascadeType.PERSIST,CascadeType.REMOVE},mappedBy=“composite”)
设置部件;
}
toplink为该对象层次结构生成DDL时,会按预期创建所有外键约束。但是,它不会为约束设置级联规则
当我现在尝试通过引用实例来删除整个对象图时,可能会出现toplink无法从数据库中正确删除该图的情况。toplink在删除包含的B实体之前删除BC实体时,违反了“复合”关系的外键约束
可以通过手动调整生成的DDL以级联(或设置NULL)相关外键约束来纠正这种情况,这对于生产环境来说很好。但是,在具有内存(Derby)数据库的测试环境中,这会失败,其中DDL生成完全由toplink essentials管理,因此会导致上述约束冲突
是否有任何方法影响DDL生成过程,以便toplink essentials正确设置所需的级联规则
谢谢你的帮助 这不是DDL生成的问题,而是删除的问题 TopLink Essentials在解决从复杂对象图或循环关系中删除时遇到一些问题。有一些解决方法,例如先删除依赖对象并调用flush,然后删除其他对象,或者将外键设置为null以更新它们。使用自定义程序将映射标记为privateOwned,或使用约束依赖关系也可以。也可以删除或延迟约束 所有的删除问题都已在EclipseLink中修复,因此升级到最新的EclipseLink版本应该可以解决这个问题 EclipseLink还支持@CascadeOnDelete注释,将级联添加到DDL生成中的约束中