Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa 在Toplink Essentials中控制DDL生成_Jpa_Jakarta Ee_Constraints_Cascade_Toplink - Fatal编程技术网

Jpa 在Toplink Essentials中控制DDL生成

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

我在Toplink Essentials的DDL生成方面遇到了一些问题。我正在开发一个基于GlassFish2.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;
}
@实体
甲级{
@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生成中的约束中