整理笔记---Hiberante对象关系

Hibernate的关系映射:

【many-to-one单向关联】

例子:班级跟学生之间的关系
【创建ClassRoom对象实例类】

package com.xing.entity;

/**
 * 一对多(一的一方)
 * Created by Administrator on 2016/8/2.
 */
public class ClassRoom {
    private int id;
    private String name ;
    private int grade;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getGrade() {
        return grade;
    }

    public void setGrade(int grade) {
        this.grade = grade;
    }
}

【创建Student对象实例类】

package com.xing.entity;

/**
 * 一对多(多的一方)
 * Created by Administrator on 2016/8/2.
 */
public class Student {

    private int id ;
    private String name ;
    private String no ;
    //多对一的单项关联
    private ClassRoom classRoom ;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNo() {
        return no;
    }

    public void setNo(String no) {
        this.no = no;
    }

    public ClassRoom getClassRoom() {
        return classRoom;
    }

    public void setClassRoom(ClassRoom classRoom) {
        this.classRoom = classRoom;
    }
}

【配置ClassRoom.hbm.xml】

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Nov 9, 2006 6:27:53 PM by Hibernate Tools 3.2.0.beta7 -->
<hibernate-mapping package="com.xing.entity">
    <class name="ClassRoom" table="t_class_room" >
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <property name="grade"/>
    </class>
</hibernate-mapping>

【配置Student.hbm.xml】

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Nov 9, 2006 6:27:53 PM by Hibernate Tools 3.2.0.beta7 -->
<hibernate-mapping package="com.xing.entity">
    <class name="Student" table="t_student" >
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <property name="no"/>
        <!-- 多的一方映射一的一方 many-to-one用来映射多对一关系,name设置对象中的属性名称,column设置当前表示多的表中的外键的名称 -->
        <many-to-one name="classRoom" column="t_class_id"></many-to-one>
    </class>
</hibernate-mapping>

【junit测试one-to-many】

import com.xing.entity.ClassRoom;
import com.xing.entity.Student;
import com.xing.util.HibernateUtil;
import org.hibernate.Session;
import org.junit.Test;

/**
 * Created by Administrator on 2016/8/2.
 */
public class TestHiernateRelationShip {
    @Test
    public void testHibernateOneToMany(){

        Session session = null ;

        try {
            session = HibernateUtil.openSession() ;
            //打开事务
            session.beginTransaction() ;
            ClassRoom classRoom = new ClassRoom() ;
            classRoom.setGrade(2016);
            classRoom.setName("微积分");
            session.save(classRoom) ;

            Student student = new Student() ;
            student.setName("韦德");
            student.setNo("003");
            student.setClassRoom(classRoom);
            session.save(student) ;

            Student student2 = new Student() ;
            student2.setName("库里");
            student2.setNo("004");
            student2.setClassRoom(classRoom);
            session.save(student2) ;

            //提交事务
            session.getTransaction().commit();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            HibernateUtil.closeSession(session);
        }

    }
}

cascade:表示级联。
设置级联后会自动完成关联,如果没有关联会自动创建关联对象。(没有特殊情况不建议使用级联,建立级联时不建议在表示多的一方建立)
cascade:的值有add,delete……all。

【one-to-many单向关联】

例子:帖子和评论
【帖子类】

package com.xing.entity;

import java.util.HashSet;
import java.util.Set;

/**
 * one-to-many (单向)
 * Created by Administrator on 2016/8/2.
 */
public class Message {
    private int id ;
    private String title;
    private String content;

    private Set<Comment> comments ;

    public Message() {
        //在构造方法中初始化
        comments = new HashSet<Comment>() ;
    }

    public void addComments(Comment comment){
        comments.add(comment) ;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public Set<Comment> getComments() {
        return comments;
    }

    public void setComments(Set<Comment> comments) {
        this.comments = comments;
    }
}

【评论类】

package com.xing.entity;

/**
 * one-to-many (单向)
 * Created by Administrator on 2016/8/2.
 */
public class Comment {
    private int id ;
    private String content ;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

【帖子hbm.xml文件配置】

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Nov 9, 2006 6:27:53 PM by Hibernate Tools 3.2.0.beta7 -->
<hibernate-mapping package="com.xing.entity">
    <class name="Message" table="t_message" >
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="title"/>
        <property name="content"/>
        <!-- set集合存储一组数据用来设置one-to-many   name指的是属性名称,,,key指的是当前对象在对方的外键名称-->
        <set name="comments">
            <key column="mid"></key>
            <one-to-many class="Comment"></one-to-many>
        </set>
    </class>
</hibernate-mapping>

【评论hbm.xml文件配置】

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Nov 9, 2006 6:27:53 PM by Hibernate Tools 3.2.0.beta7 -->
<hibernate-mapping package="com.xing.entity">
    <class name="Comment" table="t_comment" >
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="content"/>
    </class>
</hibernate-mapping>

oneTomany双向关联

例子:学生类和班级类
配置:
(1)之前的ClassRoom类中添加如下代码


    private Set<Student> stus ;

    public Set<Student> getStus() {
        return stus;
    }

    public void setStus(Set<Student> stus) {
        this.stus = stus;
    }

(2)ClassRoom.hbm.xml中添加如下代码:

        <set name="stus" lazy="extra">
            <key column="t_class_id"></key>
            <one-to-many class="Student"></one-to-many>
        </set>

建议:不要使用一的一方来维护关系,可以在一的一方也就是上面例子中的ClassRoom.hbm.xml文件中set标签做如下代码的修改“inverse=true”

        <set name="stus" lazy="extra" inverse="true">
            <key column="t_class_id"></key>
            <one-to-many class="Student"></one-to-many>
        </set>

one-to-one

外键在那一方说明那一方是用来维护关系的
例子:人和身份证
Person.java

package com.xing.entity;

/**
 * Created by Administrator on 2016/8/2.
 */
public class Person {
    private int id ;
    private String name ;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {

        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

Card.java(这里设置Card类来维护关系,所以将外键对象 设置在该类中)

package com.xing.entity;

/**
 * Created by Administrator on 2016/8/2.
 */
public class Card {
    private int id;
    private String no ;
    private Person person ;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getNo() {
        return no;
    }

    public void setNo(String no) {
        this.no = no;
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }
}

Person.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Nov 9, 2006 6:27:53 PM by Hibernate Tools 3.2.0.beta7 -->
<hibernate-mapping package="com.xing.entity">
    <class name="Person" table="t_person" >
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"></property>
    </class>
</hibernate-mapping>

Card.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Nov 9, 2006 6:27:53 PM by Hibernate Tools 3.2.0.beta7 -->
<hibernate-mapping package="com.xing.entity">
    <class name="Card" table="t_card" >
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="no"/>
        <many-to-one name="person" column="pid" unique="true"/>

    </class>
</hibernate-mapping>

一对一任意找一方用来做维护关系的一方,在映射文件中用many-to-one把外键加进来,并且用unique来设置唯一性,unique=true说明他们的关系是一对一的,一个Card对象只能对应一个Person对象

many-to-many

Admin.java

package com.xing.entity;

import java.util.Set;

/**
 * Created by Administrator on 2016/8/2.
 */
public class Admin {
    private int id;
    private String name;
    private Set<Role> roles ;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<Role> getRoles() {
        return roles;
    }

    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }
}

Role.java

package com.xing.entity;

import java.util.Set;

/**
 * Created by Administrator on 2016/8/2.
 */
public class Role {
    private int id;
    private String name ;
    private Set<Admin> admins ;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<Admin> getAdmins() {
        return admins;
    }

    public void setAdmins(Set<Admin> admins) {
        this.admins = admins;
    }
}

Admin.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Nov 9, 2006 6:27:53 PM by Hibernate Tools 3.2.0.beta7 -->
<hibernate-mapping package="com.xing.entity">
    <class name="Admin" table="t_admin" >
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <set name="roles" table="t_admin_role" lazy="extra">
            <key column="aid"> </key>
            <many-to-many />
        </set>
    </class>
</hibernate-mapping>

Role.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Nov 9, 2006 6:27:53 PM by Hibernate Tools 3.2.0.beta7 -->
<hibernate-mapping package="com.xing.entity">
    <class name="Role" table="t_role" >
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <set name="admins" table="t_admin_role" lazy="extra">
            <key column="rid"></key>
            <many-to-many class="Admin" column="aid" />
        </set>


    </class>
</hibernate-mapping>

hbm.xml文件中的table对应的是他们中间的中间表,many-to-many那个维护关系都可以。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值