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