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