У меня есть следующая модель
@Entity
class Element {
@Id
int id;
@Version
int version;
@ManyToOne
Type type;
}
@Entity
class Type {
@Id
int id;
@Version
int version;
@OneToMany(mappedBy="type")
Collection<Element> elements;
@Basic(optional=false)
boolean disabled;
}
и хотел бы разрешить Type.disabled = true, только если Type.elements пуст. Есть ли способ сделать это атомарно?
Я бы хотел предотвратить вставку элемента в транзакцию, когда соответствующий тип отключен другой транзакцией.
Обновление: извините, я не прояснил себя. Я не спрашиваю, как вызвать проверку, но как предотвратить такую последовательность:
Transaction 1 checks that Type.elements is empty
Transaction 2 checks that Type.disabled = false
Transaction 1 updates Type and sets disabled = true
Transaction 2 persists a new Element
Transaction 2 commits
Transaction 1 commits
У меня возникает ситуация, когда Type.elements не пуст и Type.disabled = true (нарушенный инвариант) Как я могу избежать этой ситуации? В нативном SQL я бы использовал пессимистическую блокировку, но JPA 1.0 не поддерживает это. Можно ли решить проблему с помощью оптимистической блокировки?