Слияние древовидной структуры в OpenJPA? - PullRequest
2 голосов
/ 21 ноября 2011

Я пытаюсь построить составную древовидную структуру, используя 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.REMOVE или CascadeType.ALL
  • добавление orphanRemoval=true (как в коде выше)

... но я все еще продолжаю получать OptimisticLockException брошенный ...

Я потерян! У кого-нибудь есть совет, что попробовать дальше?

Заранее спасибо!

1 Ответ

3 голосов
/ 21 ноября 2011

Попробуйте установить следующее свойство:

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

Дополнительная документация

...