Java 休眠一对一映射,表现为一对多

Java 休眠一对一映射,表现为一对多,java,hibernate,one-to-one,Java,Hibernate,One To One,我在帐户和公司之间使用一对一映射。公司表具有外键“Account\u id”。下面是代码 @Entity public class Company{ ................ @OneToOne @JoinColumn(name = "account_id") private Account account; ................ } @Entity public class Account{ ................

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

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

@Entity
public class Account{
    ................
    @OneToOne(mappedBy="account")
    private Company company;
    ...............
}
现在,上述映射意味着,对于一个
账户
,只有一个
公司
可以与其关联,反之亦然

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


我期待着一些例外,只有一家公司可以与特定帐户关联。我可以知道这个问题吗?

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

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


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

谢谢。我在我的hibernate实体中添加了unique=true,比如@JoinColumn(name=“account\u id”,unique=true)私有帐户;但它仍然不起作用。但是,我没有在数据库级别添加唯一约束。那么,我是否需要在数据库级别添加唯一约束?是的,您必须这样做。我的回答就是这样解释的。注释中的
unique=true
属性仅在Hibernate生成数据库架构时使用。它不在运行时使用。因此,如果您不使用Hibernate生成模式,它就没有任何用途。谢谢..它起了作用…还有一件事我们什么时候需要在Hibernate级别应用这些约束,或者考虑到这些约束已经在数据库级别应用,我们什么时候需要它..我不理解您所说的“在Hibernate级别应用这些约束”是什么意思.可以在hibernate级别(即在实体中)应用的类似于大小或长度的约束,而我们可以在数据库级别指定相同的约束..我现在说清楚了吗?