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
拋出...
我迷路了!有沒有人對接下來要嘗試什麼有什麼建議?
在此先感謝!
地獄啊!這是我的問題的解決方案!非常感謝瑞克! :) –