@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
.
Автоинкремент должен вызываться, когда сущность сначала создается и вставляется в БД.