在OpenJPA中合并树状结构?

时间:2011-11-21 12:43:24

标签: java openjpa

我正在尝试使用由这些类组成的 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.REMOVECascadeType.ALL
  • 添加orphanRemoval=true(如上面的代码所示)

...但我仍然不断地被OptimisticLockException抛出......

我迷路了!有没有人对接下来要尝试什么有任何建议?

提前致谢!

1 个答案:

答案 0 :(得分:3)

尝试设置以下属性:

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

Additional documentation