2015-09-25 131 views
0

我使用的是下面One to one mappingAccount and Company之間。公司表已經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可以與它相關,反之亦然。

現在,帳戶錶行將從其他地方插入,並且保存公司需要更新一個帳戶表列。現在,保存公司請求將包含公司詳細信息以及公司涉及的帳戶ID。在第一次請求時,公司數據以帳戶ID保存到公司數據表中,但是對於特定的account id的後續請求,即使對於特定的account id只應創建一個公司行,也會在公司表中插入新行。

我期待着一個例外,即只有一家公司可以與特定賬戶相關聯。我可以知道這個問題嗎?

回答

2

當保存一個擁有給定賬戶的新公司時,Hibernate不會檢查其他公司是否還有另一個賬戶。即使它檢查你不會有任何保證,因爲幾個併發事務應該並行檢查,然後並行插入。

防止這種情況發生的唯一方法是讓數據庫本身阻止它,如果讓Hibernate生成模式,將會發生這種情況:company表的account_id列應該有一個唯一約束。如果你自己生成你的模式,只要確保創建這樣一個唯一的約束。

一旦約束條件存在,嘗試插入已與另一公司關聯的帳戶的公司的事務將從數據庫和回滾中收到異常。

+0

謝謝JB。我在我的hibernate實體中添加了unique = true,如@JoinColumn(name =「account_id」,unique = true) \t private account account;但它仍然不起作用。但是,我沒有在數據庫級別添加唯一的約束。那麼,我需要在數據庫級別添加唯一的約束嗎? – Anand

+0

是的,你必須這樣做。這就是我的答案解釋。註釋中的unique = true屬性僅在Hibernate生成數據庫模式時使用。它沒有在運行時使用。因此,如果您不使用Hibernate生成模式,則它不起任何作用。 –

+0

謝謝..我工作...還有一件事情,當我們需要在休眠級別應用這樣的約束或者我們需要它時,考慮到這些約束已經應用在數據庫級別.. – Anand