我正在尝试使用由这些类组成的 OpenJPA 2.1 来构建复合树状结构:
Criterion
- 基础,抽象类,
SingleCriterion
- 实际的树叶,
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;
}
正如你所看到的那样,没有什么太花哨的了......
现在,由于CascadeType
,阅读和坚持整个树的工作就像一个魅力。但是当我尝试删除CompositeCriterion
节点时会出现问题,因为它删除了该节点并对子节点运行DELETE查询,当然,由于数据库表中的ON DELETE CASCADE
约束,这些节点不存在。这会导致OptimisticLockException
被抛出
我尝试了很多东西,包括:
@Dependant
注释放在criterions
内
CompositeCriterion CascadeType.REMOVE
或CascadeType.ALL
orphanRemoval=true
(如上面的代码所示) ...但我仍然不断地被OptimisticLockException
抛出......
我迷路了!有没有人对接下来要尝试什么有任何建议?
提前致谢!
答案 0 :(得分:3)
尝试设置以下属性:
<property name="openjpa.jdbc.SchemaFactory" value="native(ForeignKeys=true)"/>