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

来源:互联网 发布:sql insert 单引号 编辑:程序博客网 时间:2024/06/06 20:38

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那个维护关系都可以。

0 0