Hibernate One-To-Many和Many-to-One映射

时间:2014-07-24 21:19:42

标签: hibernate

我知道此主题已在此处讨论过。但我仍然面临着问题。我有两个表 - PersonAccountsPERSON_ID是Person表中的主键和子表帐户中的外键。 我的网络应用程序上有一个屏幕,有助于维护Person table。现在在第二个screen-Accounts,我面临着映射问题。我相信我在父类和子类中有正确的注释。但是当我尝试插入新的Account时,第二个屏幕正在插入person_id作为" null"在Accounts表中,同时触发同一Accounts表上的Update语句。不确定为什么会出现这两个问题。

由于

1 个答案:

答案 0 :(得分:0)

我正在解释方案Account * ----- 1 Person

模型的Hibernate映射将类似于

<hibernate-mapping package="models">
<class name="Person" table="HIB_PER">
        <id name="perID" column="PER_ID">
            <generator class="native"></generator>  
        </id>
        <set name="accounts" lazy="true" cascade="all">
           <key column="PER_ID"  />
           <one-to-many class="Account"/>
        </set>
    </class>
</hibernate-mapping>

帐户模型的Hibernate映射将类似于

<hibernate-mapping package="models">
    <class name="Account" table="HIB_ACC">
        <id name="accID" column="ACC_ID">
            <generator class="native"></generator>  
        </id>
    <many-to-one name="person" class="Person" column="PER_ID" lazy="no-proxy"  fetch="select"/>
    </class>
</hibernate-mapping>

两种型号(POJO)看起来都像

class Person {
    private int perID;
    private Set<Account> accounts;
    //getters and setters
}

class Account {
    private int accID;
    private Person person;
   //getters and setters
}

现在重要的部分是在上述结构中 在hibernate 的帮助下,您可以在数据库中单独保存Person对象。 但是在Account对象的情况下,您首先保存Person对象,然后在数据库中保存所有帐户

因此, 正如你的屏幕一样,

Screen-1 接受个人信息并将其保存在数据库中,如

Person p = new Person();
//set its setters
//save to DB
session.save(p)

Screen-2 接受上述人员的逐个帐户信息并将其保存在数据库中。但重要的是,您必须维护人员ID,即perID 在隐藏字段中,以便您实际知道这是谁的帐户。

Person p = get from Database with help of perID

Account acc1 =  new Account();
//set its setters
//set its owner
acc1.setPerson(p);

Account acc2 =  new Account();
//set its setters
//set its owner
acc2.setPerson(p);

//save to DB
session.save(acc1)
session.save(acc2)

此处没有Person,Account对象不会保存在数据库中。这意味着帐户与hibernates一对多关系和 perID的帮助紧密耦合,因为外键将由hibernate在帐户表中自动创建。