2011-11-21 195 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

地狱啊!这是我的问题的解决方案!非常感谢瑞克! :) –