[hibernate] hibernate one to many 和many to one 操作

 

1.先看表结构 。Father 和son两张表。

2.两个实体类:

/**
 Father实体
*/
public class Father implements Serializable {
    private int fatherId;
    private String fatherName;
    private Date createTime;
    private String status;

    private Set<Son> sons;
   
  // getter 和setter 省略
}


/**
 Son实体
*/
public class Son implements Serializable{
    private int sonId;
    private String sonName;
    private String status;
    private Father father;
// getter 和setter 省略
}

3.配置文件:

father.hbm.xml:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="com.xwolf.hibernate.bean.Father" table="FATHER" schema="DATAPROCESS">
        <id name="fatherId">
            <column name="FATHER_ID" sql-type="number" precision="22" not-null="true"/>
        </id>
        <property name="fatherName">
            <column name="FATHER_NAME" sql-type="varchar2" length="400"/>
        </property>
        <property name="createTime">
            <column name="CREATE_TIME" sql-type="date"/>
        </property>
        <property name="status">
            <column name="STATUS" sql-type="varchar2" length="40"/>
        </property>

        <set name="sons"  table="SON">
            <key column="F_ID" ></key>
  <one-to-many class="com.xwolf.hibernate.bean.Son" />
        </set>


    </class>
</hibernate-mapping>

son.hbm.xml:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="com.xwolf.hibernate.bean.Son" table="SON" schema="DATAPROCESS">
        <id name="sonId">
            <column name="SON_ID" sql-type="number" precision="22" not-null="true"/>
        </id>
        <property name="sonName">
            <column name="SON_NAME" sql-type="varchar2" length="20"/>
        </property>
        <property name="status">
            <column name="STATUS" sql-type="varchar2" length="4" not-null="true"/>
        </property>
        <!--
        多对一关系:
        name :一方的属性名称
        class:对应的类名字
        cascade : 级联属性设为delete,删除该记录的同时删除关联的对应表的记录
        column: name :多方中关联的外键

        -->
        <many-to-one name="father" class="com.xwolf.hibernate.bean.Father" fetch="join">
            <column name="F_ID" not-null="true"  sql-type="number"/>
        </many-to-one>
    </class>
</hibernate-mapping>

 

测试:

package com.xwolf.hibernate.test;

import com.xwolf.hibernate.bean.Father;
import com.xwolf.hibernate.bean.Son;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.URL;
import java.util.List;

/**
 * Created by on 2015/9/24.
 */
public class TestRealization {

    private static Session session ;

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Before
    public void before(){
        Configuration configuration = new Configuration();
        URL url =TestSearch.class.getResource("/hibernate.cfg.xml");
        configuration.configure(url);
        SessionFactory sessionFactory=configuration.buildSessionFactory();
        session=sessionFactory.openSession();
       logger.info("session 开启.....");
    }
    /**
     * 关联保存
     */
    @Test
    public void save(){
        Father father= (Father) session.get(Father.class,Integer.valueOf("13"));

        Son son =new Son();
        son.setSonId(31);
        son.setFather(father);
        son.setSonName("李斯132");
        son.setStatus("143");

        Son son1 =new Son();
        son1.setSonId(46);
        //为外键设置关联关系
        son1.setFather(father);
        son1.setSonName("李斯4342");
        son1.setStatus("1");

        session.save(son);
        session.save(son1);
        session.beginTransaction().commit();

    }

    /**
     * 多对一关系 many to one
     */
    @Test
    public void test1(){
       Son son = (Son) session.get(Son.class, Integer.valueOf("1"));
        /**
         * 删除,如设置cascade属性为delete,会同步删除关联的外键的记录
         */
       session.delete(son);
        session.beginTransaction().commit();

    }

    /**
     * 一对多 one to many
     */
    @Test
    public void test2(){

        Father father = (Father) session.load(Father.class, Integer.valueOf(13));
        System.out.println(father);
        //删除 ,同样要关注cascade 属性设置
        session.delete(father);
        session.beginTransaction().commit();

    }

    /**
     * hql 查询
     */
    @Test
    public void fetch(){
        //hql 查询
        String hql ="from Father";
       Query query = session.createQuery(hql);
        List<Father> fathers=query.list();
        for (Father father:fathers){
            System.out.println(father);
        }
    }

    @After
    public void after(){
        if(session!=null){
            session.close();
            logger.info("session关闭...");
        }
    }

}

还有很多主要的属性测试没有写测试代码,cascade ,fetch,inverse,formula,lazy,optimistic-lock 等需要深入了解。


posted @ 2015-09-25 12:56  snow__wolf  阅读(325)  评论(0)    收藏  举报