2
我想建立使用OpenJPA的2.1由这些类的复合树状结构:在OpenJPA中合并树状结构?
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
抛出...
我迷路了!有没有人对接下来要尝试什么有什么建议?
在此先感谢!
地狱啊!这是我的问题的解决方案!非常感谢瑞克! :) –