Hibernate:一对一的相关实体插入到DB而不是更新

时间:2012-03-14 13:16:19

标签: hibernate entity cascade one-to-one

@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 看起来,如果updatesaveOrUpdate方法调用,应该避免自动增量。
首次创建实体并将其插入数据库时​​,应调用自动增量。

1 个答案:

答案 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);

这将触发更新查询而不是插入。