java - Hibernate 一对一映射表现为一对多

标签 java hibernate one-to-one

我在帐户和公司之间使用下面的一对一映射。公司表具有外键“account_id”。下面是代码

@Entity
public class Company{
    ................
    @OneToOne
    @JoinColumn(name = "account_id")
    private Account account;
    ................
}

@Entity
public class Account{
    ................
    @OneToOne(mappedBy="account")
    private Company company;
    ...............
}

现在,上述映射意味着,对于一个帐户,只能与一个公司关联,反之亦然。

现在,帐户表行将从其他位置插入,并且保存公司需要更新一个帐户表列。现在,保存公司请求将包含公司详细信息和公司相关的帐户 ID。在第一次请求时,公司数据将保存到带有帐户 ID 的公司表中,但在对特定帐户 ID 的后续请求中,新行将插入公司表中,即使只应创建一个公司行特定的帐户 ID

我预计会出现一些异常(exception)情况,即只有一家公司可以与特定帐户关联。我可以知道这个问题吗?

最佳答案

当保存具有给定帐户的新公司时,Hibernate 不会检查是否有其他公司也有另一个帐户。即使它检查了,您也没有任何保证,因为多个并发事务应该并行执行该检查,然后并行插入。

防止这种情况发生的唯一方法是让数据库本身阻止它,如果您让 Hibernate 生成架构,就会发生这种情况:在 account_id 列上应该有一个唯一约束company 表。如果您自己生成架构,只需确保创建这样一个唯一的约束即可。

一旦存在约束,尝试插入帐户已与另一家公司关联的公司的事务将会从数据库中获得异常并回滚。

关于java - Hibernate 一对一映射表现为一对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32778794/

相关文章:

java - 从具有 http DELETE 类型的方法重定向到具有 GET 类型的方法

java - 为什么我仍然无法找到 Java SE 运行时环境?

java - 父子持久化中生成parent的ID

java - JPA继承要求子类中的ID

python - 为具有 OnetoOne 关系的 Django 模型创建工厂

Java,计算字符串中唯一字符之间的差异

java - 无法提醒选择值的值

java - 同一列上的多个复合唯一约束

c# - 一对一关系导致异常 : AssociationSet is in the 'Deleted' state. 给定多重约束

java - OneToOne Mapping 未设置映射对象