Java 在OpenJPA中合并树状结构?
我正在尝试使用由以下类组成的OpenJPA 2.1构建一个复合树状结构: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
标准
-基础,抽象类
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)"/>
见鬼,是啊!这就是我问题的解决办法!非常感谢,瑞克!:)