2015-09-25 3 views
0

Я использую ниже One to one mapping между Account and Company .компанией таблицей foreign key 'account_id' .Below является кодомHibernate один к одному отображению себя как один ко многому

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

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

Теперь, выше отображение означает, Для Account, только один company может быть связано с ним и наоборот.

Теперь строка таблицы учетных записей будет вставлена ​​откуда-то еще, и для сохранения компании потребуется обновить один столбец таблицы счетов. Теперь запрос «Сохранить компанию» будет содержать сведения о компании и компания, к которой относится учетная запись. По первому запросу данные компании сохраняются в таблице компании с идентификатором учетной записи, но при последующих запросах для конкретного account id новая строка вставляется в таблицу компаний, даже если для конкретного account id должна быть создана только одна строка компании.

Я ожидал некоторого исключения, что только одна компания может быть связана с определенной учетной записью. Могу ли я узнать проблему?

ответ

2

При сохранении новой компании, имеющей указанную учетную запись, Hibernate не будет проверять, что у другой компании нет другой учетной записи. И даже если он будет проверен, у вас не будет никакой гарантии, потому что несколько параллельных транзакций должны выполнить эту проверку параллельно, а затем вставить параллельно.

Единственный способ предотвратить возникновение этого события - позволить самой базе данных предотвратить его, и это произойдет, если вы позволите Hibernate сгенерировать схему: должно быть уникальное ограничение на столбец account_id таблицы company. Если вы сами генерируете свою схему, просто убедитесь, что вы создали такое уникальное ограничение.

Как только ограничение существует, транзакция, пытающаяся вставить компанию с учетной записью, которая уже связана с другой компанией, получит исключение из базы данных и отката.

+0

Спасибо JB. Я добавил unique = true в свой объект спящего режима, например @JoinColumn (name = "account_id", unique = true) \t частный счет учетной записи; но все же это не сработало. Однако я не добавил уникальное ограничение на уровне базы данных. Итак, нужно ли добавлять уникальное ограничение на уровне базы данных? – Anand

+0

Да, вы должны это сделать. Вот что объясняет мой ответ. атрибут 'unique = true' в аннотации используется только тогда, когда Hibernate генерирует схему базы данных. Он не используется во время выполнения. Поэтому, если вы не сгенерируете схему с Hibernate, это не служит никакой цели. –

+0

Спасибо .. это сработало ... еще одна вещь, когда нам нужно применять такие ограничения на уровне гибернации или вообще нам это нужно, учитывая, что такие ограничения применяются на уровне базы данных. – Anand

Смежные вопросы