Я пытаюсь построить составную древовидную структуру, используя 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
брошенный ...
Я потерян! У кого-нибудь есть совет, что попробовать дальше?
Заранее спасибо!