多對多關聯關係
多對多關聯關係的建立需要藉助第三個表來存儲多對多關聯關係信息的表。
在介紹這個關係前先介紹一個小案例,前一陣子web2.0星期的時候,也流行一個應用,就是一般blog或者信息分類網站常用的一個技術——Tag。在下面的例子裏我也將建立一個Tag應用。
在寫博客的時候,我們的文章並不一定只屬於一種分類,比如我寫了一篇文章吧,就拿現在這個爲例,我可以說它是屬於DataBase類的,一可以說是說與Hibernate類的,所以,我就將這篇文章放進這兩個分類裏面。
這樣就有一種新的分類形式,對於分類與文章來說就是一個多對多的關係了。
首先將我的Message類分個類,建立一個tag類,MsgTag
public class MsgTag {
private int tagId;
private String tagName;
private Set msgs;
Message也要做點修改,那就是加上一個存放Tag類的屬性:
public class Message {
private int msgId;
private String ttl;
private String desc;
private Date date;
private UserInfo user;
private Set tags;
建立數據庫相關的表:
CREATE TABLE msgTag(
`tag_id` int(11) NOT NULL auto_increment,
`tag_name` char(20) NOT NULL default 0,
PRIMARY KEY (`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=UTF8;
CREATE TABLE `msg_tag_role` (
`msg_id` int(11) NOT NULL ,
`tag_id` int(11) NOT NULL ,
PRIMARY KEY (`msg_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=UTF8;
其中msg_tag_role 用來存放message與tag關聯關係的表。
在做多對多關係的配置中<many-to-many>節點很重要,基本兩個表的應射文件都要用到這個節點。
先在Message.hbm.xml這個文件里加一個節點:
<set name="grps" table="msg_tag_role" cascade="save-update" fetch="join">
<key column="msg_id"/>
<many-to-many class="xiaojin.hibernate.entity.MsgTag" column="tag_id"></many-to-many>
</set>
同時MsgTag.hbm.xml文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="xiaojin.hibernate.entity.MsgTag" table="msgtag" >
<id name="tagId" type="java.lang.Integer">
<column name="tag_id" />
<generator class="native"></generator>
</id>
<property name="tagName" type="java.lang.String">
<column name="tag_name" />
</property>
<set name="msgs" table="msg_tag_role" cascade="save-update" inverse="false">
<key column="tag_id"/>
<many-to-many class="xiaojin.hibernate.entity.Message" column="msg_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
這樣我們的多對多關係就建立起來了,可以看到,該關係的建立完全都是表msg_tag_role 起的作用。
測試方法:
public static void saveMsgAndTag(){
MsgTag tag1 = new MsgTag();
tag1.setTagName("yule");
MsgTag tag2 = new MsgTag();
tag2.setTagName("jingji");
Set grps = new HashSet<MsgTag>();
grps.add(tag1);
grps.add(tag2);
Message msg1 = new Message();
msg1.setTtl("yule_msg1");
msg1.setDesc("desc");
msg1.setTags(grps);
Message msg2 = new Message();
msg2.setTtl("yule_msg2");
msg2.setDesc("desc");
msg1.setTags(grps);