声明:本博文用于学习总结及工作心得
在使用hibernate时,经常会遇到对象与对象之间的关系映射,比如一对多,多对一,多对多;这里来聊一下多对多的配置文件
SIPGroup类
public class SIPGroup {
private Integer id;
private String name;
private String orderNumber;//分组号
private String rules;
private String attachments;//铃声
private Set<Gateway> gateways;
private Set<SIPInfo> sipInfos;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRules() {
return rules;
}
public void setRules(String rules) {
this.rules = rules;
}
public String getAttachments() {
return attachments;
}
public void setAttachments(String attachments) {
this.attachments = attachments;
}
public Set<Gateway> getGateways() {
return gateways;
}
public void setGateways(Set<Gateway> gateways) {
this.gateways = gateways;
}
public Set<SIPInfo> getSipInfos() {
return sipInfos;
}
public void setSipInfos(Set<SIPInfo> sipInfos) {
this.sipInfos = sipInfos;
}
public String getOrderNumber() {
return orderNumber;
}
public void setOrderNumber(String orderNumber) {
this.orderNumber = orderNumber;
}
}
SIPGroup.hbm,xml
<hibernate-mapping>
<class name="com.rhxy.bean_new.sip.SIPGroup" table="sipGroup">
<comment>SIP用户</comment>
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="name" type="java.lang.String" column="name"/>
<property name="orderNumber" type="java.lang.String" column="orderNumber"/>
<property name="rules" type="java.lang.String" column="rules"/>
<property name="attachments" type="java.lang.String" column="attachments"/>
<set name="gateways" lazy="false" inverse="true">
<key column="sipGroup_id"></key>
<one-to-many class="com.rhxy.bean_new.sip.Gateway"/>
</set>
<set name="sipInfos" table="sipGroup_sipInfo" cascade="all" inverse="false" lazy="false">
<key column="sipGroup_id"/>
<many-to-many class="com.rhxy.bean_new.sip.SIPInfo" column="sipInfo_id"/>
</set>
</class>
</hibernate-mapping>
SIPInfo类
public class SIPInfo {
private Integer id;
private String username;
private String passwd;
private User user;
private Set<SIPGroup> sipGroups;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Set<SIPGroup> getSipGroups() {
return sipGroups;
}
public void setSipGroups(Set<SIPGroup> sipGroups) {
this.sipGroups = sipGroups;
}
}
SIPInfo.hbm.xml
<hibernate-mapping>
<class name="com.rhxy.bean_new.sip.SIPInfo" table="sipInfo">
<comment>SIP用户</comment>
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="username" type="java.lang.String" column="username"/>
<property name="passwd" type="java.lang.String" column="passwd"/>
<many-to-one name="user" class="com.rhxy.bean_new.personnel.User" column="user_id" lazy="false"/>
<set name="sipGroups" table="sipGroup_sipInfo" inverse="true" lazy="false">
<key column="sipInfo_id"/>
<many-to-many class="com.rhxy.bean_new.sip.SIPGroup" column="sipGroup_id" />
</set>
</class>
</hibernate-mapping>
针对上面的配置做一下说明:都是通过Set的方式来配置,通过table这个属性来指定相应的中间表名称,inverse用于关联控制,cascade用户控制级联操作。
注意:
1、cascade设置,如果cascade没有设置,那么当我们在保存时将不能级联保存
2、inverse设置:其设置在此尤为关键,inverse表示控制关联关系是否更新到数据库,即:关联关系控制,如果两边都设置为true,即:都不管理、都不主控,此时 Hibernate将不会对关联关系进行维护,即:并没有添加数据到中间表。所以必须一方设置未True,代表主控,一方设置未false