我需要更好地了解 hibernate 的这种行为,并且想知道我是否可以对此事有所了解。
有两个对象,Contact
和 Action
具有一对多关系,即一个 Contact
可以有多个 Action
与他们有关。
我想要了解的是,当我存储 Contact
时,如何存储 Action
的集合(这是 Contact
的属性)到数据库。
目前我正在做的是先存储Contact
,然后存储Action
。
以下是我的代码:
模型对象:
public class Contact implements Serializable{
private Integer contactID;
private String givenName;
private String familyName;
private Set<Action> actionSet = new HashSet<Action>();
}
public class Action implements Serializable{
private Integer actionID;
private String actionNote;
private Contact contact;
}
hibernate 映射:
<hibernate-mapping package="com.hibernate.model" schema="hibernatedb">
<class name="Contact" table="CONTACT">
<id column="CONTACT_ID" length="500" name="contactID">
<generator class="increment" />
</id>
<property column="GIVEN_NAME" generated="never" lazy="false" length="100" name="givenName" />
<property column="FAMILY_NAME" generated="never" lazy="false" length="100" name="familyName" />
<!-- one to many mapping with Action -->
<set inverse="true" lazy="false" name="actionSet" sort="unsorted">
<key column="CONTACT_ID" />
<one-to-many class="com.hibernate.model.Action" />
</set>
</class>
</hibernate-mapping>
<hibernate-mapping package="com.hibernate.model" schema="hibernatedb">
<class name="Action" table="ACTION">
<id column="ACTION_ID" length="500" name="actionID">
<generator class="increment" />
</id>
<property column="ACTION_NOTE" type="string" name="actionNote" />
<!-- many to one mapping with Contact -->
<many-to-one name="contact" column="CONTACT_ID"
class="com.hibernate.model.Contact" lazy="false" cascade="save-update" />
</class>
</hibernate-mapping>
这就是我目前尝试存储它的方式:
public class ContactServiceImpl implements ContactService{
@Override
public void addContacts(Contact contact) {
contactDAO.addContact(contact);//saving the contact;
if((contact.getActionSet()!=null)&&(contact.getActionSet().size()>0)){
actionService.addAllActions(contact,contact.getActionSet());//saving actions, associated with the contact
}
}
}
看,有两个操作导致保存 Action
,因为它们是 Contact
的属性,并且我相信当 Contact
保存后,Action
的集合也必须保存。
请让我知道正确的做法。谢谢
最佳答案
尝试设置
<set cascade="all"....
这样,当您在联系人实体上调用保存时,hibernate 将保存您的操作集。
参见this回答以获取更多详细信息。
另请参阅the documentation .
关于java - Hibernate,在单个操作中保存集合属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15508696/