Как я могу проверить, что на объект не ссылаются в JPA? - PullRequest
1 голос
/ 10 июня 2010

У меня есть следующая модель

@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 не поддерживает это. Можно ли решить проблему с помощью оптимистической блокировки?

Ответы [ 2 ]

2 голосов
/ 10 июня 2010

Я бы хотел предотвратить вставку элемента в транзакцию, когда соответствующий тип отключен другой транзакцией.

Я бы использовал API проверки бинов (JSR 303) и пользовательское ограничение для этой цели.Если вы не знакомы с Bean Validation, я предлагаю прочитать следующие записи:

0 голосов
/ 11 июня 2010

, в то время как Bean Validation в соответствии с предложением Pascal более элегантно, быстрым и простым решением будут методы прослушивания жизненного цикла объекта внутри класса объекта:класс Assert (как в JUnit или Spring, который инкапсулирует исключение):

@PrePersist @PreUpdate
protected void validate(){
    Assert.same( // but this implies a bi-directional constraint
            this.disabled, this.elements.isEmpty(),
            "Only types without elements may be disabled and vice-versa"
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...