Hibernate ORM框架——续第二章:Hibernate映射关系:双向关联

一、多对多(在双方实体中都加入一个Set)

(1)HibernateUtil包映射文件不变

 

(2)hibernate.cfg.xml配置文件基本不变:除了两个映射文件更换顺序会引起中间表的数据跟着改变。

思考来源:中间表插入数据insert into 中间表(“类1”,“类2”);和insert into 中间表(“类2”,“类1”);顺序会不会变?

(3.1)实体一:班级

package shuang.m2m;

import java.util.Set;

public class ClassInfo {
    private String cid ;
    private String name;
    //一对多
    private Set<Person> persons;
}

(3.2)实体二:学生(人)

package shuang.m2m;

import java.util.Date;
import java.util.Set;

public class Person {
    private String pid ;//UUID
    private String name;
    private Set<ClassInfo> cis;
}

(4.1)班级实体映射文件

<?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 package="shuang.m2m">
    <class name="ClassInfo" table="CLASSINFO">
        <id name="cid" column="cid">
            <generator class="assigned"></generator>
        </id>
        <property name="name" ></property>
<!--
      set name="persons" :持久化属性名 table="classperson":中间表名
      <key column="rcid"></key>:与本实体关联的外键名
      <many-to-many column="rpid" class="Person"></many-to-many>:相关联实体的外键名以及类名
      -->
        <set name="persons" table="classperson">
            <key column="rcid"></key>
            <many-to-many column="rpid" class="Person"></many-to-many>
        </set>
    
    </class>
</hibernate-mapping>

(4.2)班级实体映射文件

<?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 package="shuang.m2m">
    <class name="Person" table="persons">
        <id name="pid" column="pid">
            <generator class="assigned"></generator>
        </id>
        <property name="name" ></property>
        
        <set name="cis" table="classperson">
            <key column="rpid"></key>
            <many-to-many column="rcid" class="ClassInfo"></many-to-many>
        </set>
    </class>
    
</hibernate-mapping>

 

二、一对多、多对一(想象多的一方是学生,在其类中加private ClassInfo ci;一的一方是班级,在其类中加private Set<Person> persons;)

(1)(2)HibernateUtil和hibernate.cfg.xml配置文件都是一样的

(3.1)班级实体

package shuang.m2oo2m;

import java.util.Set;

public class ClassInfo {
    private String cid ;
    private String name;
    //一对多
    private Set<Person> persons;
}

(3.2)学生实体

package shuang.m2oo2m;

import java.util.Date;

public class Person {
    private String pid ;//UUID
    private String name;
    private ClassInfo ci; 
}

(4.1)班级映射文件

<?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 package="shuang.m2oo2m">
    <class name="ClassInfo" table="CLASSINFO">
        <id name="cid" column="cid">
            <generator class="assigned"></generator>
        </id>
        <property name="name" ></property>
        
        <set name="persons">
            <key column="rci" ></key>
            <one-to-many class="Person"/>
        </set>
    </class>
</hibernate-mapping>

(4.2)学生映射文件

<?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 package="shuang.m2oo2m">
    <class name="Person" table="persons">
        <id name="pid" column="pid">
            <generator class="assigned"></generator>
        </id>
        <property name="name" ></property>
        
        <many-to-one name="ci" column="rci"></many-to-one>
    </class>
</hibernate-mapping>

 

三、一对一(在双方类都加一个对方的类)

(1)(2)HibernateUtil和hibernate.cfg.xml配置文件都是一样的

(3.1)班级实体

package shuang.o2o;

import java.util.Set;

public class ClassInfo {
    private String cid ;
    private String name;
    private Person p;
}

(3.2)学生实体

package shuang.o2o;

import java.util.Date;
import java.util.Set;

public class Person {
    private String pid ;//UUID
    private String name;
    private ClassInfo c;
}

(4.1)班级映射文件

<?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 package="shuang.o2o">
    <class name="ClassInfo" table="CLASSINFO">
        <id name="cid" column="cid">
            <generator class="assigned"></generator>
        </id>
        <property name="name" ></property>
        <!-- 我们心中认为这个类是一的一方,也就是其对应的表
            没有外键,在此配置一定要加property-ref已确定自己的主键
            与对方哪一列建立联系
         -->
        <one-to-one name="p" property-ref="c"></one-to-one>
    </class>
</hibernate-mapping>

(4.2)学生映射文件

<?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 package="shuang.o2o">
    <class name="Person" table="persons">
        <id name="pid" column="pid">
            <generator class="assigned"></generator>
        </id>
        <property name="name" ></property>
        
        <many-to-one name="c" column="rcid" unique="true"></many-to-one>
    </class>
</hibernate-mapping>

 

四、个人总结

 

五、数据库中MySQL语句中,的写法总结: 

(1)不管是单向还是多向的一对一,都是需要在SQL语句中加上唯一约束语句

(2)多对多中间多了一张中间表,与有两个外键约束

(3)其余的都是通用多对一的SQL语句

 

/*以上个人整理笔记,如果有误或者有不懂的地方,欢迎评论与指出*/

posted @ 2017-08-16 14:35  梁宝谊  阅读(144)  评论(0编辑  收藏  举报