gpt4 book ai didi

java - 如何检查 JPA 中是否未引用实体?

转载 作者:行者123 更新时间:2023-11-30 05:12:15 25 4
gpt4 key购买 nike

我有以下模型

@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.elements 为空时才允许 Type.disabled = true。有没有办法以原子方式完成它?

我想防止在相应的类型被其他事务禁用时在事务中插入元素。

更新:抱歉我没有说清楚。我不是在问如何触发检查,而是在问如何防止出现这样的序列:

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 (损坏的不变量)的情况。我怎样才能避免这种情况呢?在 native SQL 中,我会使用悲观锁定,但 JPA 1.0 不支持这一点。使用乐观锁可以解决这个问题吗?

最佳答案

I would like to prevent an insertion of an Element in a transaction while the corresponding Type is being disabled by an other transaction.

我将使用 Bean Validation API (JSR 303) 和自定义约束来实现此目的。如果您不熟悉 Bean Validation,我建议您阅读以下条目:

关于java - 如何检查 JPA 中是否未引用实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3013986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com