Hibernate中的一对一,一对多,多对多详解。

1、inverse属性:是否反转,默认为false就是不反转然后就是自己维护两方的关系,true就是反转,意思是让对方维护关系。 作用:提高开发的效率

在一对多中,一的一方可以放弃维护提高效率,多的一方必须要维护,因为外键在多的一方。

在多对多中,维护关系理论上随便哪方维护都行,必须要指定只有一方维护不然双方都维护的话,就会在中间表中插入两条一模一样的数据,这时候就会发生冲突,但实际开发中要看具体的业务

例:公司要给新来的员工设置角色,这时候就是由员工来维护双方的关系,因为员工是动态增加或删除的,而公司的角色一般都不会变

2、cascade属性: 默认为none不级联 级联操作(意思就是哪方设置了,这一方的操作或者状态都会让与之关联的对象同步这个状态或操作) 作用:节省写代码的行数(写不写都没什么大关系),建议不要设置,如果业务需求要有的话,最好只用save-update

里面一共有三个可选值(save-update,delete,all)。

save-update:就是保存或更新会让与之关联的对象同步

delete:删除会让与之关联的对象同步

all:以上两种的效果合并

(getset方法自己生成)

一对多的配置方法:

用寝室和学生为例(一个寝室可以有多个学生,一个学生只能属于一个寝室)

Student.java(创建成员变量==》一的一方的引用)

public class Student {
    
    private Integer sid;
    private String studentName;
    
    private Dorm dorm;
}

Dorm.java(创建成员变量==》多的一方的集合)

public class Dorm {
    
    private Integer dormId; //主键
    
    private Set<Student> students = new HashSet<Student>();
}

Student.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 package="com.ahead.pojo">
    <class name="Student" table="student">
        <id name="sid" column="sid">
            <generator class="native"></generator>
        </id>
        <property name="studentName" type="java.lang.String">
            <column name="student_name"></column>
        </property>
        
        <!-- many-to-one:name=一的一方的属性名
                         class=与之关联的全路径类型
                         (上面配了package可以写类名)
             column:name=存在数据库中的外键名
         -->
        <many-to-one name="dorm" class="Dorm">
            <column name="dorm_id"></column>
        </many-to-one>
                
    </class>

</hibernate-mapping>

Dorm.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 package="com.ahead.pojo">
    <class name="Dorm" table="dorm">
        <id name="dormId" column="dorm_id">
            <generator class="native"></generator>
        </id>
        
        <!-- set:name=集合名称
            key:column=多的一方引用我的主键
            one-to-many:class=哪个对象与我关联的全路径类名
                        (上面配了package可以写类名)
         -->
        <set name="students" >
            <key column="dorm_id">
            </key>
            <one-to-many class="Student"/>
        </set>        
            
    </class>

</hibernate-mapping>

执行测试数据库

一对一的配置方法(其实跟一对多差不多):

用学生和身份证举例 (一个学生只能有一张身份证,一张身份证只能属于一个学生):

Student.java(创建环境变量==》对应一的一方的引用)

public class Student {
    
    private Integer sid;
    private String studentName;
    
    //一名学生只有一张身份证
    private IdCard idCard;
}

IdCard.java(创建环境变量==》对应一的一方的引用)

public class IdCard {
    
    private Integer id; //主键
    
    //一张身份证对应一名学生 有外键的一方
    private Student student;
}

Student.hbm.xml(直接在配置文件配one-to-one就好了)

<?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="com.ahead.pojo">
    <class name="Student" table="student">
        <id name="sid" column="sid">
            <generator class="native"></generator>
        </id>
        <property name="studentName" type="java.lang.String">
            <column name="student_name"></column>
        </property>
        
        <one-to-one name="idCard" class="IdCard"></one-to-one>
        
    </class>

</hibernate-mapping>

IdCard.hbm.xml

注意:哪方是有外键的一方,就要当作多对一来进行配置,其中一定要指定unique="true"

<?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="com.ahead.pojo">
    <class name="IdCard" table="idcard">
        <id name="id" column="id">
            <generator class="native"></generator>
        </id>
        
        <many-to-one name="student" class="Student" unique="true" >
            <column name="sid"></column>
        </many-to-one>
    </class>

</hibernate-mapping>

执行测试数据库:

多对多的配置方法:

以学生和课程做例子(一个学生可以选多门课程,一个课程可以被多名学生选)

理解记忆:先拆分成两边一对多分析就好做了

画图分析多对多的原理

直接贴代码

Student.java(创建成员变量==》对应多的一方的集合)

public class Student {
    
    private Integer sid;
    private String studentName;
    
    //多对多,一个学生对应多门课程,一门课程对应多个学生
    private Set<Course> courses = new HashSet<Course>();
}

Course.java(创建成员变量==》对应多的一方的集合)

public class Course {
    
    private Integer cid; //主键
    private String courseName; //课程名称
    
    //多对多,一门课程对应多个学生,一个学生对应多门课程
    private Set<Student> students = new HashSet<Student>();
}

Student.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 package="com.ahead.pojo">
    <class name="Student" table="student">
        <id name="sid" column="sid">
            <generator class="native"></generator>
        </id>
        <property name="studentName" type="java.lang.String">
            <column name="student_name"></column>
        </property>
        
        <!-- 多对多关系    是一方的配置另外一方也是一样的套路就是相反
            name:集合属性名
            table:中间表名
            key->column:(用一对多的思想来考虑[这里当作一的一方])中间表的外键,别人引用“我”的主键当作外键
            
            class:我与哪个类是多对多关系   这里写那个类的全路径名(上面package写了所以这里可以不用写)
            column:(用多对一的思想[这里当作多的一方])中间表的外键,我引用别人的主键当作外键(与之关联的实体类的主键)
         -->
        <set name="courses" table="stu_middle_cour" inverse="true">
            <key column="sid" >
            </key>
            <many-to-many column="cid" class="Course"></many-to-many>
        </set>
        
    </class>

</hibernate-mapping>

Course.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 package="com.ahead.pojo">
    <class name="Course" table="course">  
        <id name="cid" column="cid">
            <generator class="native"></generator>
        </id>
        <property name="courseName" type="java.lang.String">
            <column name="course_name" ></column>
        </property>
        
        <set name="students" table="stu_middle_cour">
            <key column="cid" />
            <many-to-many column="sid" class="Student"></many-to-many>
        </set>
    </class>

</hibernate-mapping>

  

启动测试

mysql中的表

猜你喜欢

转载自www.cnblogs.com/YangRijian/p/9972967.html
今日推荐