hibernate一对一,一对多,多对一,多对多关系映射与级联

总结一下hibernate的多种关系映射与级联
(1)one-to-many (一对多)
          实体类中one方封装一个set集合(set集合装的是many对象)作为属性,并初始化。实体many方封装一个one对象。
         以UserInfo---EmailInfo---LetterInfo 三张表来级联说明主控方的选择与cascade的配置
         1)生成配置文件。
          2)选择主控方,设置级联操作。(one-tomany,many-to-one 一般选择many一方作为主控方)
              inverse = false;表示主控方,关系表的维护由主控方维护。一般在one-to-many或many-to-many中设置
              cascade级联:属性值有:
                    none,all,save-update,delete, lock,refresh,evict,replicate,persist, merge,delete-orphan(one-to-many)
               inverse在双向关系中 inverse 只需要在一方配置即可(其中cascade级联与inverse一起使用)
           3)在级联查询与删除中cascade在set标签中配置。
          4)添加,修改cascade配置以主控方要影响的对象为根据配置。
例如:以Letter做主控方添加email,user。
  //LetterInfo.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.sxt.entity.LetterInfo" table="letter_info" catalog="email">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native" />
        </id>
        <property name="title" type="java.lang.String">
            <column name="title" length="30" not-null="true" />
        </property>
        <!-- 在要级联的地方(主控方要影响的)添加cascade不一定在set -->
         <many-to-one name="email" class="com.sxt.entity.EmailInfo" cascade="all">
            <column name="eid" not-null="true" />
        </many-to-one>
    </class>
</hibernate-mapping>
//EmailInfo.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.sxt.entity.EmailInfo" table="email_info" catalog="email">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native" />
        </id>
        <property name="address" type="java.lang.String">
            <column name="address" length="20" not-null="true" />
        </property>
     <!-- 对于user,email为主控,要影响user  -->
        <many-to-one name="user" class="com.sxt.entity.UserInfo" cascade="all">
            <column name="uid" not-null="true" />
        </many-to-one>
       <!-- 此处指明letter为主控 -->
        <set name="letters" inverse="true">
            <key>
                <column name="eid" not-null="true" />
            </key>
            <one-to-many class="com.sxt.entity.LetterInfo" />
        </set>
    </class>
</hibernate-mapping>              
// UserInfo.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.sxt.entity.UserInfo" table="user_info" catalog="email">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="20" not-null="true" />
        </property>
        <set name="emails" inverse="true">
            <key>
                <column name="uid" not-null="true" />
            </key>
            <one-to-many class="com.sxt.entity.EmailInfo" />
        </set>
    </class>
</hibernate-mapping>
//test.java
/**
* 以letter为主控:(many方为主控,推荐)
* 在要影响的地方添加cascade
*/
public void testAddLetter(){
Session session = HibernateSessionFactory.getSession();
LetterInfo letter = new LetterInfo("华山论剑");

EmailInfo email = new EmailInfo("1212@qq.com");

UserInfo user = new UserInfo("黄蓉");

letter.setEmail(email);
email.setUser(user);

Transaction tx = session.beginTransaction();
session.save(letter);
tx.commit();
HibernateSessionFactory.closeSession();
}        
/**
* 删除用户同时删除邮箱与邮箱内的邮件
* letter为主控配置inverse,cascade在set中配置(与查询一样)
* 
*/
public void testDeleteUser(){
Session session = HibernateSessionFactory.getSession();
UserInfo user = (UserInfo) session.get(UserInfo.class,25);
//EmailInfo email = (EmailInfo)session.get(EmailInfo.class,2);
Transaction tx = session.beginTransaction();
session.delete(user);
tx.commit();
HibernateSessionFactory.closeSession();
}
 /**
     * 以user为主控:(one 方为主控)
     *  瞬时态数据持久化需要注意:
     *   对象数据需要双向设置
     *   
     *   
     */
public void testAddUser(){
Session session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction();

UserInfo user = new UserInfo("萨斯");
EmailInfo e1 = new EmailInfo("wass@qq.com");

LetterInfo letter = new LetterInfo("欢迎你,萨斯");
letter.setEmail(e1);
e1.getLetters().add(letter);
e1.setUser(user);
user.getEmails().add(e1);
session.save(user);
tx.commit();
HibernateSessionFactory.closeSession();
}
public void testQueryUser(){
Session session = HibernateSessionFactory.getSession();
UserInfo ui = (UserInfo)session.get(UserInfo.class, 1);
System.out.println(ui.getName());
   Set<EmailInfo>emails = ui.getEmails();
   for (EmailInfo ei : emails) {
System.out.println(ei.getAddress());
Set<LetterInfo> letters = ei.getLetters();
for (LetterInfo letter : letters) {
System.out.print("\t"+letter.getTitle());
}
System.out.println("");
}
   HibernateSessionFactory.closeSession();
}
     
public void testQueryEmail(){
Session session = HibernateSessionFactory.getSession();
LetterInfo letter = (LetterInfo)session.get(LetterInfo.class, 1);
System.out.println("信件:"+letter.getTitle());
EmailInfo email= letter.getEmail();
System.out.println("\t"+email.getAddress());
UserInfo user = email.getUser();
System.out.println("\t\t"+user.getName());
HibernateSessionFactory.closeSession();
}
        //one-to-one
     以cardInfo-personInfo
    //CardInfo.hbm.xml文件
    <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.sxt.entity.CardInfo" table="card_info" catalog="students">
        <id name="cid" type="java.lang.Integer">
            <column name="cid" />
            <generator class="native" />
        </id>
       <one-to-one name="person"/>
        <property name="code" type="java.lang.String">
            <column name="code" length="20" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

//PersonInfo.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.sxt.entity.PersonInfo" table="person_info" catalog="students">
        <id name="pid" type="java.lang.Integer">
            <column name="pid" />
            <generator class="native" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="20" not-null="true" />
        </property>
        <one-to-one name="card"/>
    </class>
</hibernate-mapping>
/**
* one-to-one
*   
*/
public void test5(){
Session session = HibernateSessionFactory.getSession();
PersonInfo person = (PersonInfo)session.get(PersonInfo.class,1);
   System.out.println(person.getName()+"\t"+person.getCard().getCode());
   HibernateSessionFactory.closeSession();
}
many-to-many
   以studentinfo-teacherInfo为例
//TeacherInfo.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.sxt.entity.TeacherInfo" table="teacher_info" catalog="students">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="20" not-null="true" />
        </property>
        <set name="students">
            <key column="tid"/>
            <many-to-many class="com.sxt.entity.StudentInfo" column="sid"/>
        </set>
    </class>
</hibernate-mapping>
//StudentInfo.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.sxt.entity.StudentInfo" table="student_info" catalog="students">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="20" not-null="true" />
        </property>
        <set name="teachers" inverse="false" table="student_teacher_info" cascade="all">
            <key column="sid" not-null="true"/>
            <many-to-many class="com.sxt.entity.TeacherInfo" column="tid"/>
        </set>
    </class>
</hibernate-mapping>

//java部分
/**
* many-to-many:级联操作之添加数据(包括添加瞬时态与持久态)
*/
public void test2(){
Session session = HibernateSessionFactory.getSession();
//添加瞬时态数据
// StudentInfo stu = new StudentInfo("郭靖");
// Set<TeacherInfo> teachers = new HashSet<TeacherInfo>();
// TeacherInfo t1 = new TeacherInfo("洪七公");
// TeacherInfo t2 = new TeacherInfo("江南七怪");

//根据持久态数据添加关系
Transaction transaction = session.beginTransaction();
TeacherInfo t1 = (TeacherInfo) session.get(TeacherInfo.class,1);
TeacherInfo t2 = (TeacherInfo) session.get(TeacherInfo.class,2);
Set<TeacherInfo> teachers = new HashSet<TeacherInfo>();
teachers.add(t1);
teachers.add(t2);
//以学生为主控方,学生维护关系表
StudentInfo stu = (StudentInfo) session.get(StudentInfo.class,1);
stu.setTeachers(teachers);
session.update(stu);
transaction.commit();
HibernateSessionFactory.closeSession();
}
/**
* many-to-many:级联操作之更新数据(删除)
*/
public void test3(){
Session session = HibernateSessionFactory.getSession();
//TeacherInfo ti = (TeacherInfo) session.get(TeacherInfo.class,5);

Transaction tx = session.beginTransaction();
StudentInfo  stu = (StudentInfo)session.get(StudentInfo.class, 1);
TeacherInfo  t  = (TeacherInfo)session.get(TeacherInfo.class, 2);
// session.delete(stu);//删除关系与学生
//仅删除关系,不删除老师
stu.getTeachers().remove(t);
session.update(stu);
tx.commit();
HibernateSessionFactory.closeSession();
}
/**
* 测试many-to-many:级联操作之更新数据(修改);
*/
public void test4(){
Session session = HibernateSessionFactory.getSession();
StudentInfo stu = (StudentInfo)session.get(StudentInfo.class, 1);
TeacherInfo t1 = (TeacherInfo)session.get(TeacherInfo.class,1);
TeacherInfo t2 = (TeacherInfo)session.get(TeacherInfo.class,2);
        stu.getTeachers().remove(t1);
        stu.getTeachers().add(t2);
Transaction tx = session.beginTransaction();
session.update(stu);
tx.commit();
HibernateSessionFactory.closeSession();
}










  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值