У меня естьJPA значение дерева распространения на упорствовать/слияния
@Entity
public class Node
{
@ManyToOne
private Node parent;
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Node> children;
@ManyToMany
private List<Owner> ownerList;
...
}
, и я хочу, чтобы распространять owner
с для детей на упорствовать/слияния. Правило:
Any node must have at least its parent node owners
Я попытался
@PreUpdate
public void propagateOwnersTopDown(Node node)
{
for(Node child : node.getChildren())
{
for(Owner owner : node.getOwnerList())
{
if(!child.getOwnerList().contains(owner))
{
child.getOwnerList().add(owner);
}
}
}
}
и либо
@PreUpdate
public void propagateOwnersBottomUp(Node node)
{
if(node.getParent() == null) return;
for(Owner owner : node.getParent().getOwnerList())
{
if(!node.getOwnerList().contains(owner))
{
node.getOwnerList().add(owner);
}
}
}
, даже если я знаю, что это не законно, а на самом деле, они не работают (@PreUpdate
вызывается только по корню).
Я знаю, что могу
- написать
addOwner()
метод, распространяющуюся владельца для детей- , но если какой-либо другой код вызывает
node.getOwnerList().add(owner)
распространения является лопнул
- , но если какой-либо другой код вызывает
или
- явно вызвать
propagateOwnersTopDown()
или что-то вроде как раз передem.merge(node)
(как правило, когда внутри транзакции)- , но я должен добавить это к каждому EJB/транзакционного метода
Интересно, есть ли какая-то отличный способ для этого.
Я не эксперт по БД, но возможно ли достичь согласованности с хранимой процедурой/триггером/чем-нибудь?
Если это правда, можно ли/законно использовать процедуру/триггер/что-нибудь в @PrePersist
/@PreUpdate
?
Я на EclipseLink 2.5.2 и MySQL 5.6
Спасибо.
EclipseLink 2.5.2 имеет JPA 2.1. – Tiny
Вы правы. Благодарю. –