hibernate的many-to-many的示例

hibernate的many-to-many的示例


————不管失敗成功,我只想認真活一生!
爲java工程師奮鬥的我!

小弟剛剛結束三大框架裏的struts2,馬馬虎虎吧,也不知道到底掌握的如何。那麼就這麼算過去了。前兩天開始了第二個框架,hibernate!額,學了也快三天了吧,裏面的門道也能稍微可以看出來了。所以呢,一個小小的示例還是要有的。呵呵。

這是一個hibernate的映射問題,1-N,N-1,1-1,N-N,這麼幾種吧。個人覺得前面幾種應該不難,有難度的還是n-n,剛開始有點混,後來多想想還是蠻簡單的。下面開始吧。


同樣實例採用mvc的架構。首先貼出兩個javabean。

package com.gang.entity;

import java.util.HashSet;
import java.util.Set;
//這是一個人類
public class Person {

    private int pid;
    private String name;
    private String sex;
    private Set<Address> addresses=new HashSet<Address>();
    //省略各元素的setter,getter方法
    ...
    //構造器
    public Person(String name, String sex) {
        super();
        this.name = name;
        this.sex = sex;
    }
    public Person(int pid, String name, String sex) {
        super();
        this.pid = pid;
        this.name = name;
        this.sex = sex;
    }

}

//這是一個地址類
package com.gang.entity;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

public class Address implements Serializable{
    private  int aid;
    private  String aname;
    private  String adesc;
    private  Set<Person> persons=new HashSet<Person>();
    //省略個元素的setter,getter方法
    ...
    //構造器
    public Address(int aid, String aname, String adesc) {
        super();
        this.aid = aid;
        this.aname = aname;
        this.adesc = adesc;
    }
    public Address(String aname, String adesc) {
        super();
        this.aname = aname;
        this.adesc = adesc;
    }


}

ok!兩個javabean搞定,當然這是小兒科。hibernate在表映射方面即可以使用註釋,也可以使用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">
<!-- Generated 2016-5-28 0:17:19 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.gang.entity.Address" table="address">
        <id name="aid" type="int">
            <column name="aid" />
            <generator class="increment" />
        </id>
        <property name="aname" type="java.lang.String">
            <column name="aname" />
        </property>
        <property name="adesc" type="java.lang.String">
            <column name="adesc" />
        </property>
       <!--這是地址類裏的人類,他們是主外鍵關係,並將這兩個類的id分別作爲各自的外鍵,保存在p_a數據表裏-->
        <set name="persons" table="p_a" inverse="false" cascade="all">
            <key>
                <column name="aid" />
            </key>
            <many-to-many class="com.imooc.entity.Person" column="pid"/>
        </set>
    </class>
</hibernate-mapping>

<!--這是人類的配置文件-->
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-5-28 0:17:19 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.imooc.entity.Person" table="person">
        <id name="pid" type="int">
            <column name="pid" />
            <generator class="increment" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" />
        </property>
        <property name="sex" type="java.lang.String">
            <column name="sex" />
        </property>
        <!--這是人類裏的地址類,他們是主外鍵關係,並將這兩個類的id分別作爲各自的外鍵,保存在p_a數據表裏-->
        <set name="addresses" table="p_a" cascade="save-update" inverse="true">
            <key>
                <column name="pid" />
            </key>
            <many-to-many class="com.imooc.entity.Address" column="aid"/>
        </set>
    </class>
</hibernate-mapping>

兩個javabean,兩個配置文件 很清晰。接下來是hibernate的配置文件。這文件學過hibernate就應該非常清了.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">chen*****</property>
        <property name="hibernate.connection.url">
            <![CDATA[
                jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characterEncoding=utf8
            ]]>
        </property>
        <property name="show_sql">true</property>
        <property name="hbm2ddl.auto">update</property>

        <!-- 指定映射文件的路徑 -->
        <mapping resource="com/gang/entity/Address.hbm.xml"/>
        <mapping resource="com/gang/entity/Person.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

最後呢 我們對他進行測試。
首先編寫工具類,用於測試前獲取必要的對象。

package com.gang.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
    private static SessionFactory sessionFactory;
    private static Session session;

    static {
        // 創建Configuration對象,讀取hibernate.cfg.xml文件,完成初始化
        Configuration config = new Configuration().configure();
        StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder()
                .applySettings(config.getProperties());
        StandardServiceRegistry ssr=ssrb.build();
        sessionFactory=config.buildSessionFactory(ssr);
    }

    //獲取SessionFactory
    public static SessionFactory getSessionFactory(){
        return sessionFactory;
    }

    //獲取Session
    public static Session getSession(){
        session=sessionFactory.openSession();
        return session;
    }

    //關閉Session
    public static void closeSession(Session session){
        if(session!=null){
            session.close();
        }
    }
}

最後就是測試:

package com.gang.test;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.imooc.entity.Address;
import com.imooc.entity.Person;
import com.imooc.util.HibernateUtil;

public class test {

    private static Session session;
    public static void save(){
        Person p1=new Person("張三", "男");
        Person p2=new Person("李四", "男");
        Address a1=new Address("浙江", "德清");
        Address a2=new Address("浙江", "yuyue");
        p1.getAddresses().add(a1);
        p1.getAddresses().add(a2);
        p2.getAddresses().add(a1);
        a2.getPersons().add(p1);
        a1.getPersons().add(p2);
        a1.getPersons().add(p1);
        session=HibernateUtil.getSession();
        Transaction tx=session.beginTransaction();
        session.save(p1);
        session.save(p2);
        tx.commit();
        HibernateUtil.closeSession(session);

    }

    public static void main(String[] args) {
        save();
    }
}

。運行上述代碼,我們發現數據庫中多了三個表

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

不錯,和源代碼裏的設置一致。(張三既在德清也在yuyue,而李四隻在德清)。


三大框架說簡單算簡單,說難也有點難。呵呵! 加油吧。把他踩在腳底下。
2016/5/28 1:48am

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章