2011-11-21 55 views
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.REMOVECascadeType.ALL
  • 加入orphanRemoval=true(因爲它是在裏面代碼如上)

...但我仍然不斷收到OptimisticLockException拋出...

我迷路了!有沒有人對接下來要嘗試什麼有什麼建議?

在此先感謝!

回答

3

嘗試設置以下屬性:

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

Additional documentation

+1

地獄啊!這是我的問題的解決方案!非常感謝瑞克! :) –