Hibernate 一对一映射表现为一对多
Hibernate One to One mapping behaving as One to many
我在 Account and Company
之间使用下面的 One to one mapping
。公司 table 有 foreign key 'account_id'
。下面是代码
@Entity
public class Company{
................
@OneToOne
@JoinColumn(name = "account_id")
private Account account;
................
}
@Entity
public class Account{
................
@OneToOne(mappedBy="account")
private Company company;
...............
}
现在,上面的映射意味着,对于一个 Account
,只有一个 company
可以与其关联,反之亦然。
现在,将从其他地方插入帐户 table 行,保存公司需要更新一个帐户 table 列。现在,保存公司请求将包含公司详细信息和公司相关的帐户 ID。在第一次请求时,公司数据使用帐户 ID 保存到公司 table,但在对特定 account id
的后续请求中,新行被插入公司 table,即使只有一个公司行应该为特定的 account id
.
创建
我原以为只有一家公司可以与特定帐户相关联。我可以知道这个问题吗?
在保存具有给定帐户的新公司时,Hibernate 不会检查是否没有其他公司也有另一个帐户。即使它检查了你也没有任何保证,因为几个并发事务应该并行进行检查,然后并行插入。
防止这种情况发生的唯一方法是让数据库本身阻止它,如果让 Hibernate 生成模式,就会发生这种情况:应该在 account_id
列上有一个唯一约束company
table。如果您自己生成架构,只需确保创建这样一个唯一约束。
一旦约束存在,试图插入一个公司的事务已经关联到另一个公司的帐户将从数据库中获取异常并回滚。
我在 Account and Company
之间使用下面的 One to one mapping
。公司 table 有 foreign key 'account_id'
。下面是代码
@Entity
public class Company{
................
@OneToOne
@JoinColumn(name = "account_id")
private Account account;
................
}
@Entity
public class Account{
................
@OneToOne(mappedBy="account")
private Company company;
...............
}
现在,上面的映射意味着,对于一个 Account
,只有一个 company
可以与其关联,反之亦然。
现在,将从其他地方插入帐户 table 行,保存公司需要更新一个帐户 table 列。现在,保存公司请求将包含公司详细信息和公司相关的帐户 ID。在第一次请求时,公司数据使用帐户 ID 保存到公司 table,但在对特定 account id
的后续请求中,新行被插入公司 table,即使只有一个公司行应该为特定的 account id
.
我原以为只有一家公司可以与特定帐户相关联。我可以知道这个问题吗?
在保存具有给定帐户的新公司时,Hibernate 不会检查是否没有其他公司也有另一个帐户。即使它检查了你也没有任何保证,因为几个并发事务应该并行进行检查,然后并行插入。
防止这种情况发生的唯一方法是让数据库本身阻止它,如果让 Hibernate 生成模式,就会发生这种情况:应该在 account_id
列上有一个唯一约束company
table。如果您自己生成架构,只需确保创建这样一个唯一约束。
一旦约束存在,试图插入一个公司的事务已经关联到另一个公司的帐户将从数据库中获取异常并回滚。