Java 在OpenJPA中合并树状结构?

Java 在OpenJPA中合并树状结构?,java,openjpa,Java,Openjpa,我正在尝试使用由以下类组成的OpenJPA 2.1构建一个复合树状结构: 标准-基础,抽象类 singleCriteria-实际的树叶 CompositeCriterion-实际树节点 @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name="dtype",discriminatorType=DiscriminatorType.STRING) public abstract class Crite

我正在尝试使用由以下类组成的OpenJPA 2.1构建一个复合树状结构:

标准
-基础,抽象类

singleCriteria
-实际的树叶

CompositeCriterion
-实际树节点

@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="dtype",discriminatorType=DiscriminatorType.STRING)
public abstract class Criterion implements Serializable{
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;

    @ManyToOne
    @JoinColumn(name="owner_id")
    private Criterion owner;
}

public class SimpleCriterion extends Criterion{
    @Column(name="comparison_op")
    private String op;

    @Column(name="simple_field_name")
    private String fieldName;

    @Column(name="simple_param_1")  
    private String fieldParam1;

    @Column(name="simple_param_2")  
    private String fieldParam2;
}

public class CompositeCriterion extends Criterion{
    @Column(name="composite_name")
    private String name;

    @Enumerated(EnumType.STRING)
    @Column(name="logical_op")  
    private LogicalOp op;

    @OneToMany(mappedBy="owner",fetch=FetchType.EAGER, cascade={CascadeType.PERSIST,CascadeType.MERGE}, orphanRemoval=true)
    private List<Criterion> criterions;
}
继承(策略=InheritanceType.SINGLE_表) @鉴别器列(name=“dtype”,鉴别器类型=鉴别器类型.STRING) 公共抽象类标准实现了可序列化{ @身份证 @GeneratedValue(策略=GenerationType.IDENTITY) 私人长id; @许多酮 @JoinColumn(name=“owner\u id”) 私人业主; } 公共类SimpleRiterion扩展了标准{ @列(name=“comparison\u op”) 私有字符串op; @列(name=“simple\u field\u name”) 私有字符串字段名; @列(name=“simple_param_1”) 私有字符串字段参数1; @列(name=“simple_param_2”) 私有字符串字段参数2; } 公共类CompositeCriterion扩展标准{ @列(name=“composite_name”) 私有字符串名称; @枚举(EnumType.STRING) @列(name=“logical_op”) 专用逻辑运算; @OneToMany(mappedBy=“owner”,fetch=FetchType.EAGER,cascade={CascadeType.PERSIST,CascadeType.MERGE},orphanRemoving=true) 私有列表标准; } 正如你所看到的,那里没有什么特别的东西

现在,由于
CascadeType
,读取和持久保存整个树的工作非常有魅力。但是,当我尝试删除
CompositeCriterion
节点时,会出现一个问题,因为它会删除该节点并对子节点运行删除查询,而子节点自然不存在,因为数据库表中存在
on delete CASCADE
约束。这将导致抛出
OptimisticLockException

我尝试过很多事情,包括:

  • @dependent
    注释放在 复合晶体
  • 添加
    CascadeType。删除
    CascadeType。全部
  • 添加
    删除=true
    (如上代码所示)
。。。但我仍然不断地抛出
OptimisticLockException

我迷路了!有人对下一步该做什么有什么建议吗


提前谢谢

尝试设置以下属性:

<property name="openjpa.jdbc.SchemaFactory" value="native(ForeignKeys=true)"/>


见鬼,是啊!这就是我问题的解决办法!非常感谢,瑞克!:)