@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
时出现问题。
生成了新人ID,插入一个新行到人员表中。
如何做到这一点,Person
适当的行要更新而不是插入?
感谢您的帮助。
假设:
我认为,问题是在引用实体时自动增加id
看起来,如果update
或saveOrUpdate
方法调用,应该避免自动增量。
首次创建实体并将其插入数据库时,应调用自动增量。
答案 0 :(得分:2)
您的假设是正确的,
看起来,在更新或saveOrUpdate方法调用的情况下应该避免自动增量。首次创建实体并将其插入数据库时,应调用自动增量。
你不必为了所有这些而烦恼,hibernate将使用一个简单的规则来执行此操作,当对象的id为null时,它会触发插入查询,如果它是任何其他值,它会触发更新查询具有该值。
在您保存用户之前,请将person
ID设置为oldPersonId。
public void editUser(User user, Person person) {
person.SetId(oldPersonId);
user.setPerson(person);
getHibernateTemplate().update(user);
这将触发更新查询而不是插入。