Hibernate之关系映射的两种方式(xml映射、annotation注解映射)

本文列出了两种关系映射包括一对一和一对多(多对一),并且列出了两种方式(xml映射和annotation注解映射)分别对一对一和一对多的代码,关键地方标有注释解释。可供初学者参考。
欢迎初学者加入群:583763961一起交流学习,也欢迎大牛加群指导。共同学习,共同进步。

主键关系映射代码之一对一##

一个学生对应一条登录信息(用户名、密码),一条登录信息对于一个学生
一.xml文件映射
1.在Student类中加入一个对方类型的属性,即登录信息类的实例。

package com.ffy.studentmanage;


import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
public class Student {
    private int id;
    private int sid;
    private String firstName;
    private String lastName;
    private String gender;
    private String phone;
    private String email;
    private String dateOfBirth;
    private double height=160;
    private int studentStatusID;

    //在student表中加入StudentLogin属性
    private StudentLogin studentLogin;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getSid() {
        return sid;
    }
    public void setSid(int sid) {
        this.sid = sid;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastname() {
        return lastName;
    }
    public void setLastname(String lastName) {
        this.lastName = lastName;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getDateOfBirth() {
        return dateOfBirth;
    }
    public void setDateOfBirth(String dateOfBirth) {
        this.dateOfBirth = dateOfBirth;
    }
    public double getHeight() {
        return height;
    }
    public void setHeight(double height) {
        this.height = height;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public int getStudentStatusID() {
        return studentStatusID;
    }
    public void setStudentStatusID(int studentStatusID) {
        this.studentStatusID = studentStatusID;
    }

    public StudentLogin getStudentLogin() {
        return studentLogin;
    }
    public void setStudentLogin(StudentLogin studentLogin) {
        this.studentLogin = studentLogin;
    }
    public String toString(){
        return this.id+":"+this.lastName+this.firstName+this.gender+":"+this.phone+":"+this.email+";username"+studentLogin.getUsername()+";password:"+studentLogin.getPassword();
    }
}

2.配置student.hbm.xml,基本属性配置方法不变,StudentLogin的配置如下。

<?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">
<hibernate-mapping>
    <class name="com.ffy.studentmanage.Student" table="student">
        <id name="id" column="id">
            <generator class="assigned"></generator>
        </id>
        <property name="sid" column="sid"></property>
        <property name="firstName" column="firstname"></property>
        <property name="lastName" column="lastname"></property>
        <property name="gender" column="gender"></property>
        <property name="phone" column="phone"></property>
        <property name="email" column="email"></property>
        <property name="dateOfBirth" column="date_of_birth"></property>
        <property name="studentStatusID" column="student_status_id"></property>
        <property name="height" column="height"></property>
        //对方的属性的映射,name属性为,Student的studentLogin属性,class为对方类,意味将studentLogin属性与studentLogin类建立一对一的映射关系
        <one-to-one name="studentLogin" class="com.ffy.studentmanage.StudentLogin" cascade="all"></one-to-one>
    </class>
</hibernate-mapping>

3.在hibernate.cfg.xml注册student.hbm.xml文件

<mapping resource="StudentLogin.hbm.xml"/>

二.annotation注解映射
1.在hibernate.cfg.xml注册StudentLogin类

<mapping class="com.ffy.studentmanage.StudentLogin"/>

2.在Student中添加注解

package com.ffy.studentmanage;


import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
@Entity
@Table(name="student")
public class Student {
    @Id
    @Column(name="id")
    private int id;
    @Column(name="sid")
    private int sid;
    @Column(name="firstname")
    private String firstName;
    @Column(name="lastname")
    private String lastName;
    @Column(name="gender")
    private String gender;
    @Column(name="phone")
    private String phone;
    @Column(name="email")
    private String email;
    @Column(name="date_of_birth")
    private String dateOfBirth;
    @Column(name="height")
    private double height=160;
    @Column(name="student_status_id")
    private int studentStatusID;

    //在student表中加入StudentLogin属性,并标注为一对一属性
    @OneToOne
    @PrimaryKeyJoinColumn
    private StudentLogin studentLogin;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getSid() {
        return sid;
    }
    public void setSid(int sid) {
        this.sid = sid;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastname() {
        return lastName;
    }
    public void setLastname(String lastName) {
        this.lastName = lastName;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getDateOfBirth() {
        return dateOfBirth;
    }
    public void setDateOfBirth(String dateOfBirth) {
        this.dateOfBirth = dateOfBirth;
    }
    public double getHeight() {
        return height;
    }
    public void setHeight(double height) {
        this.height = height;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public int getStudentStatusID() {
        return studentStatusID;
    }
    public void setStudentStatusID(int studentStatusID) {
        this.studentStatusID = studentStatusID;
    }

    public StudentLogin getStudentLogin() {
        return studentLogin;
    }
    public void setStudentLogin(StudentLogin studentLogin) {
        this.studentLogin = studentLogin;
    }
    public String toString(){
        return this.id+":"+this.lastName+this.firstName+this.gender+":"+this.phone+":"+this.email+";username"+studentLogin.getUsername()+";password:"+studentLogin.getPassword();
    }
}

主键关系映射代码之多对一(一对多)##

一个学生对应一条状态,一条状态对应多个学生

一.xml文件映射

多方代码#

1.在Student类(多的那方)中加入一个对方类型的属性,即登录信息类的实例。


@Table(name="student")
public class Student {
    private int id;
    private int sid;
    private String firstName;
    private String lastName;
    private String gender;
    private String phone;
    private String email;
    private String dateOfBirth;
    private double height=160;

    //多的一方,加入对方的一个类的属性。一个学生对于一个状态。
    private StudentStatus status;

    private StudentLogin studentLogin;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getSid() {
        return sid;
    }
    public void setSid(int sid) {
        this.sid = sid;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastname() {
        return lastName;
    }
    public void setLastname(String lastName) {
        this.lastName = lastName;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getDateOfBirth() {
        return dateOfBirth;
    }
    public void setDateOfBirth(String dateOfBirth) {
        this.dateOfBirth = dateOfBirth;
    }
    public double getHeight() {
        return height;
    }
    public void setHeight(double height) {
        this.height = height;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public StudentStatus getStatus() {
        return status;
    }
    public void setStatus(StudentStatus status) {
        this.status = status;
    }
    public StudentLogin getStudentLogin() {
        return studentLogin;
    }
    public void setStudentLogin(StudentLogin studentLogin) {
        this.studentLogin = studentLogin;
    }
    public String toString(){
        return this.id+":"+this.lastName+this.firstName+this.gender+":"+this.phone+":"+this.email+";username"+studentLogin.getUsername()+";password:"+studentLogin.getPassword();
    }
}

2.配置student.hbm.xml,基本属性配置方法不变,StudentStatus的配置如下。

<class name="com.ffy.studentmanage.Student" table="student">
        <id name="id" column="id">
            <generator class="assigned"></generator>
        </id>
        <property name="sid" column="sid"></property>
        <property name="firstName" column="firstname"></property>
        <property name="lastName" column="lastname"></property>
        <property name="gender" column="gender"></property>
        <property name="phone" column="phone"></property>
        <property name="email" column="email"></property>
        <property name="dateOfBirth" column="date_of_birth"></property>
        <property name="studentStatusID" column="student_status_id"></property>
        <property name="height" column="height"></property>
        <one-to-one name="studentLogin" class="com.ffy.studentmanage.StudentLogin" cascade="all"></one-to-one>
        //表明多个学生可以对应一条状态,name对应Student类中的属性status,id为student_status表中的id字段(即student表中有一个外键student_status_id,对应student_status表的id字段,class表示一的一方为StudentStatus类)
        <many-to-one name="status" column="id" class="com.ffy.studentmanage.StudentStatus"></many-to-one>
    </class>

一方代码

1.在StudentStatus类(一的那方)中加入一个对方(多方)类型的属性,即学生信息类的实例。

public class StudentStatus {
    private int id;
    private String code;
    private String name;
    private String description;

    //加入一个集合,泛型为Student,用于存放该状态对应的学生,因为一条状态对呀多个学生,所以需要用集合表示
    private Set<Student> students=new HashSet<>();

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }

    public Set<Student> getStudents() {
        return students;
    }
    public void setStudents(Set<Student> students) {
        this.students = students;
    }
    public String toString(){
        return "id:"+this.id+";name"+this.name+";code:"+this.code;
    }
}

2.配置studentStatus.hbm.xml,基本属性配置方法不变,Students的配置如下。

<hibernate-mapping>
    <class name="com.ffy.studentmanage.StudentStatus" table="student_status">
        <id name="id" column="id">
            <generator class="assigned"></generator>
        </id>
        <property name="code" column="code"></property>
        <property name="name" column="name"></property>
        <property name="description" column="description"></property>
        //集合存放该状态对应的多个学生,name为属性名(即集合名称),column表示相关联的外键,
        <set name="students" cascade="all" inverse="true">
            <key column="student_status_id"></key>  
            //表示一个状态对应多个学生,calss表示对应的多的那方的类(即与之相对应的类)
            <one-to-many class="com.ffy.studentmanage.Student"/>
        </set>
    </class>
</hibernate-mapping>

二、annotation注解映射

多的那方

1.在hibernate.cfg.xml注册Student类

<mapping class="com.ffy.studentmanage.Student"/>

2.在Student类中添加注解


@Entity
@Table(name="student")
public class Student {
    @Id
    @Column(name="id")
    private int id;
    @Column(name="sid")
    private int sid;
    @Column(name="firstname")
    private String firstName;
    @Column(name="lastname")
    private String lastName;
    @Column(name="gender")
    private String gender;
    @Column(name="phone")
    private String phone;
    @Column(name="email")
    private String email;
    @Column(name="date_of_birth")
    private String dateOfBirth;
    @Column(name="height")
    private double height=160;

    /*
     *  多的一方,加入对方的一个类的属性。一个学生对于一个状态。
     *  name="student_status_id"表明一的那方为外键student_status_id锁对应的表
     */
    @ManyToOne
    @JoinColumn(name="student_status_id")
    private StudentStatus status;

    @OneToOne
    @PrimaryKeyJoinColumn
    private StudentLogin studentLogin;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getSid() {
        return sid;
    }
    public void setSid(int sid) {
        this.sid = sid;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastname() {
        return lastName;
    }
    public void setLastname(String lastName) {
        this.lastName = lastName;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getDateOfBirth() {
        return dateOfBirth;
    }
    public void setDateOfBirth(String dateOfBirth) {
        this.dateOfBirth = dateOfBirth;
    }
    public double getHeight() {
        return height;
    }
    public void setHeight(double height) {
        this.height = height;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public StudentStatus getStatus() {
        return status;
    }
    public void setStatus(StudentStatus status) {
        this.status = status;
    }
    public StudentLogin getStudentLogin() {
        return studentLogin;
    }
    public void setStudentLogin(StudentLogin studentLogin) {
        this.studentLogin = studentLogin;
    }
    public String toString(){
        return this.id+":"+this.lastName+this.firstName+this.gender+":"+this.phone+":"+this.email+";username"+studentLogin.getUsername()+";password:"+studentLogin.getPassword();
    }
}

一的那方#

1.在hibernate.cfg.xml注册StudentStatus类

<mapping class="com.ffy.studentmanage.StudentStatus"/>

2.在StudentStatus类中添加注解

package com.ffy.studentmanage;

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

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Table(name="student_status")
@Entity
public class StudentStatus {
    @Id()
    @Column(name="id")
    private int id;
    @Column(name="code")
    private String code;
    @Column(name="name")
    private String name;
    @Column(name="description")
    private String description;

    /*
     * 加入一个集合,泛型为Student,用于存放该状态对应的学生,因为一条状态对呀多个学生,所以需要用集合表示
     * name="id":student_status表的主键为Student表的外键,这样子就能找到Student(多的那方)
     * 的student_status_id为student_status表的id的字段,两者对应
     */
    @OneToMany
    @JoinColumn(name="id")
    private Set<Student> students=new HashSet<>();

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }

    public Set<Student> getStudents() {
        return students;
    }
    public void setStudents(Set<Student> students) {
        this.students = students;
    }
    public String toString(){
        return "id:"+this.id+";name"+this.name+";code:"+this.code;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值