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

发布了26 篇原创文章 · 获赞 1 · 访问量 9795

猜你喜欢

转载自blog.csdn.net/qq_31884013/article/details/51521028