Hibernate 关系映射、多对多many to many

many-to-many

在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型;hibernate会为我们创建中间关联表,转换成两个一对多

<one-to-many>中,建议inverse=”true”,由“many”方来进行关联关系的维护
<many-to-many>中,只设置其中一方inverse=”false”,或双方都不设置

 

新建学生

         private int sid;

         private String sname;.

新建老师

         private int tid;

         private String tname;

新建Stud.hbm.xml文件

      <class name="com.tfsoft.manytomany.Stud" table="stud">

        <id name="sid">

          <generator></generator>

        </id>

        <property name="sname" length="20"></property>

       

        <set name="teacs" table="st"><!-- 中间表名称 -->

           <key column="s_id" not-null="true"></key><!-- 学生主键在中间表中的字段名称 -->

           <many-to-many column="t_id" class="com.tfsoft.manytomany.Teac"></many-to-many>

                         <!-- 老师主键在中间表中的字段名称 -->

        </set>

      </class>

新建Teac.hbm.xml文件

      <class name="com.tfsoft.manytomany.Teac" table="teac">

        <id name="tid">

          <generator></generator>

        </id>

       

        <property name="tname" length="20"></property>

       

        <set name="studs" table="st"><!-- 中间表名称 -->

           <key column="t_id" not-null="true"></key><!-- 学生主键在中间表中的字段名称 -->

           <many-to-many column="s_id" class="com.tfsoft.manytomany.Stud"></many-to-many>

        </set>

      </class>

新建测试类

public class Many {

         private static Configuration cf = null;

         private static SessionFactory sf = null;

         static{

                   cf = new Configuration().configure();

                   sf = cf.buildSessionFactory();

         }

        

         //新增老师

         public void saveOrUpdateTeac(Teac teac){

                   Session session = sf.openSession();

                   Transaction ts = session.beginTransaction();

                   session.saveOrUpdate(teac);

                   ts.commit();

                   session.close();

         }

        

         //修改老师

         public void saveOrUpdateTeac(int tid){

                   Session session = sf.openSession();

                   Transaction ts = session.beginTransaction();

                   Teac teac = (Teac)session.get(Teac.class, tid);

                  

                   Set studs = teac.getStuds();

                   studs.add(getStudById(1));

                  

                   teac.setStuds(studs);

                  

                   session.saveOrUpdate(teac);

                   ts.commit();

                   session.close();

         }

        

         //拿老师对象

         public Teac getTeacById(int tid){

                   Session session = sf.openSession();

                   Transaction ts = session.beginTransaction();

                   Teac teac = (Teac)session.get(Teac.class, tid);

                   ts.commit();

                   session.close();

                   return teac;

         }

        

        

         //新增学生

         public void saveOrUpdateStud(Stud stud){

                   Session session = sf.openSession();

                   Transaction ts = session.beginTransaction();

                   session.saveOrUpdate(stud);

                   ts.commit();

                   session.close();

         }

        

         //拿学生对象

         public Stud getStudById(int sid){

                   Session session = sf.openSession();

                   Transaction ts = session.beginTransaction();

                   Stud stud = (Stud)session.get(Stud.class, sid);

                   ts.commit();

                   session.close();

                   return stud;

         }

        

        

 

 

         public static void main(String[] args) {

                   // TODO Auto-generated method stub

                   Many m = new Many();

                  

/*               Teac t = new Teac();                   新增老师

                   t.setTname("老师A");

                   m.saveOrUpdateTeac(t);

                  

                   Stud s = new Stud();          新增学生

                   s.setSname("学生A");

                   m.saveOrUpdateStud(s);*/

                  

/*               Teac t = m.getTeacById(1);               通过Id获取老师对象

 

                   Set studs = new HashSet();               新建集合

                   Stud stud = m.getStudById(2);                  通过Id获取学生

                   studs.add(stud);                将获取的学生放入集合

 

                   t.setStuds(studs);             将集合放入学生类

                   m.saveOrUpdateTeac(t);*/               执行方法

                  

       m.saveOrUpdateTeac(1);

                  

         }

}

多对多转换成一对多使用

 

新建学生

         private int sid;

         private String sname;

 

         //中间表集合

         private Set sts = new HashSet();

新建老师

         private int tid;

         private String tname;

 

         private Set sts = new HashSet();

新建中间表

         private int id;

         private Teac teac;

         private Stud stud;

 

新建Stud.hbm.xml

      <class name="com.tfsoft.manytomany2.Stud" table="stud">

        <id name="sid">

          <generator></generator>

        </id>

       

        <property name="sname" length="20"></property>

       

        <set name="sts" inverse="true">

           <key column="s_id" not-null="true"></key><!-- 学生主键在中间表中的字段名称 -->

           <one-to-many class="com.tfsoft.manytomany2.St"/>

        </set>

       

      </class>

新建Teac.hbm.xml

      <class name="com.tfsoft.manytomany2.Teac" table="teac">

        <id name="tid">

          <generator></generator>

        </id>

       

        <property name="tname" length="20"></property>

       

        <set name="sts" inverse="true">

           <key column="t_id" not-null="true"></key><!-- 学生主键在中间表中的字段名称 -->

           <one-to-many class="com.tfsoft.manytomany2.St"/>

        </set>

      </class>

新建St.hbm.xml

      <class name="com.tfsoft.manytomany2.St" table="st">

        <id name="id">

          <generator></generator>

        </id>

       

        <many-to-one name="teac" class="com.tfsoft.manytomany2.Teac" column="t_id" not-null="true">

        </many-to-one>

       

        <many-to-one name="stud" class="com.tfsoft.manytomany2.Stud">

           <column name="s_id" not-null="true"></column>

        </many-to-one>

       

      </class>

测试类

public class Many {

         private static Configuration cf = null;

         private static SessionFactory sf = null;

         static {

                   cf = new Configuration().configure();

                   sf = cf.buildSessionFactory();

         }

 

         // 新增老师

         public void saveOrUpdateTeac(Teac teac) {

                   Session session = sf.openSession();

                   Transaction ts = session.beginTransaction();

                   session.saveOrUpdate(teac);

                   ts.commit();

                   session.close();

         }

 

         // 拿老师对象

         public Teac getTeacById(int tid) {

                   Session session = sf.openSession();

                   Transaction ts = session.beginTransaction();

                   Teac teac = (Teac) session.get(Teac.class, tid);

                   ts.commit();

                   session.close();

                   return teac;

         }

 

         // 新增学生

         public void saveOrUpdateStud(Stud stud) {

                   Session session = sf.openSession();

                   Transaction ts = session.beginTransaction();

                   session.saveOrUpdate(stud);

                   ts.commit();

                   session.close();

         }

 

         // 拿学生对象

         public Stud getStudById(int sid) {

                   Session session = sf.openSession();

                   Transaction ts = session.beginTransaction();

                   Stud stud = (Stud) session.get(Stud.class, sid);

                   ts.commit();

                   session.close();

                   return stud;

         }

 

         // 新增中间表

         public void saveOrUpdateSt(St st) {

                   Session session = sf.openSession();

                   Transaction ts = session.beginTransaction();

                   session.saveOrUpdate(st);

                   ts.commit();

                   session.close();

         }

 

         // 通过两个外键取一个对象

         public St getStById(int sid, int tid) {

                   Session session = sf.openSession();

                   Transaction ts = session.beginTransaction();

 

                   Query query = session.createQuery("from St where stud.sid=" + sid

                                     + " and teac.tid=" + tid);

                   List list = query.list();

                   St st = (St) list.get(0);

 

                   ts.commit();

                   session.close();

                   return st;

         }

 

         // 删除老师

         public void deleteTeac(Teac teac) {

                   Session session = sf.openSession();

                   Transaction ts = session.beginTransaction();

                   session.delete(teac);

                   ts.commit();

                   session.close();

         }

 

         public static void main(String[] args) {

                   Many m = new Many();

         /*     St st = new St();

                   Teac t = m.getTeacById(1);               //获取老师

                   Stud s =m.getStudById(2);                //获取学生

                   st.setStud(s);                              放到中间表

                   st.setTeac(t);

                   m.saveOrUpdateSt(st);*/                 新增

                  

 

                  

                   /*  St st = m.getStById(2, 1);          修改中间表,通过Id获取对象

                     Teac t = m.getTeacById(2);          通过Id获取老师对象

                     st.setTeac(t);                          将老师添加到中间表中

                     m.saveOrUpdateSt(st);*/             修改

                    

                  

                   m.deleteTeac(m.getTeacById(2));            通过Id获取老师,再删除

 

         }

}


转载于:https://my.oschina.net/u/2353689/blog/476085

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值