Hibernate: один-к-одному связанный объект вставляется в БД вместо обновления - PullRequest
1 голос
/ 14 марта 2012
@ManagedBean
@SessionScoped
public class User {
private Person person;
...

user.hbm.xml

<hibernate-mapping>
    <class name="entry.User" table="users">
        <id name="usaa">
            <generator class="increment"/>
        </id>
        <property name="username" column="username"/>
        <property name="password" column="password"/>
        <property name="enabled" column="enabled"/>

        <many-to-one name="person" class="entry.Person" column="perid" not-null="true" cascade="all" unique="true"/>            
    </class>
</hibernate-mapping>

person.hbm.xml

<hibernate-mapping>
    <class name="entry.Person" table="person">
        <id name="id" column="perid">
            <generator class="increment"/>
        </id>
        <property name="firstName" column="firstname"/>
        <property name="lastName" column="lastname"/>
        <property name="middleName" column="middlename"/>
        <property name="dob" column="dob"/>
    </class>
</hibernate-mapping>

Таким образом, one-to-one отношение рассчитано выше.

Правильно работающий метод DAO:

public void createUser(User user) {
user.setPerson(new Person());
getHibernateTemplate().save(user);
..

, когда User вставлено в БД, Person также автоматически вставляется в БД.Все нормально.

Неожиданно работающий метод DAO:

public void editUser(User user, Person person) {
user.setPerson(person);
getHibernateTemplate().update(user);
...

Возникла проблема при обновлении User новыми данными Person.

Создан новый идентификатор человека и одна новая строка вставлена ​​ в таблицу Person.

Как это сделать, Person соответствующая строка должна быть обновлена ​​ и не вставлена?

Спасибо за помощь.

Предположение:

Я предполагаю, что проблема заключается в автоинкременте id с при обращении кСущность.
Похоже, следует избегать автоинкрементации в случае вызовов методов update или saveOrUpdate.
Автоинкремент должен вызываться, когда сущность сначала создается и вставляется в БД.

1 Ответ

2 голосов
/ 14 марта 2012

Ваши предположения верны,

Похоже, следует избегать автоинкрементации в случае вызовов метода update или saveOrUpdate. Автоинкремент должен вызываться, когда сущность сначала создается и вставляется в БД.

Вам не нужно беспокоиться обо всем этом, hibernate будет использовать простое правило, чтобы сделать это, когда id объекта равен нулю, он запускает запрос вставки, если это любое другое значение, он запускает запрос обновления. с этим значением .

В вашем случае перед сохранением пользователя установите для идентификатора person значение oldPersonId.

public void editUser(User user, Person person) {
person.SetId(oldPersonId);
user.setPerson(person);
getHibernateTemplate().update(user);

Будет запущен запрос на обновление вместо вставки.

...