Hibernate基本映射

多对一:在多的一端加入一个外键,指向一的一端。(例子:多个用户属于一个组)

对象及实体关系图:


User:

package com.bjpowernode.hibernate;

public class User {

	private int id;
	
	private String name;
	
	private Group group;

	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 Group getGroup() {
		return group;
	}

	public void setGroup(Group group) {
		this.group = group;
	}
}

User.hbm.xml

<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.User" table="t_user">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<many-to-one name="group" column="groupid" cascade="save-update"/>
	</class>
</hibernate-mapping>

Group.hbm.xml

<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Group" table="t_group">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
	</class>
</hibernate-mapping>

一对一

主键单向关联:让两个实体主键一样。(例:一个人对应一个身份证号码)

对象及实体关系图:


Person:

package com.bjpowernode.hibernate;

public class Person {

	private int id;
	
	private String name;
	
	private IdCard idCard;

	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 IdCard getIdCard() {
		return idCard;
	}

	public void setIdCard(IdCard idCard) {
		this.idCard = idCard;
	}
}

Person.hbm.xml

<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Person" table="t_person">
		<id name="id">
			<!-- 采用foreign生成策略,forgeign会取得关联对象的标识 -->
			<generator class="foreign">
				<!-- property只关联对象 -->
				<param name="property">idCard</param>
			</generator>
		</id>
		<property name="name"/>
		<!--one-to-one指示hibernate如何加载其关联对象,默认根据主键加载
			也就是拿到关系字段值,根据对端的主键来加载关联对象
			constrained="true表示,当前主键(person的主键)还是一个外键
			参照了对端的主键(IdCard的主键),也就是会生成外键约束语句 -->
		<one-to-one name="idCard" constrained="true"/>
	</class>
</hibernate-mapping>

IdCard.hbm.xml

<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.IdCard" table="t_idCard">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="cardNo"/>
	</class>
</hibernate-mapping>

主键双向关联:一张卡只属于一个人(需要在IdCard加入<one-to-one>标签,指示hibernate将关联对象Person,不影响存储,只影响加载)

对象及实体关系图:


IdCard:

package com.bjpowernode.hibernate;

public class IdCard {
	
	private int id;
	
	private String cardNo;
	
	private Person person;

	public int getId() {
		return id;
	}

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

	public String getCardNo() {
		return cardNo;
	}

	public void setCardNo(String cardNo) {
		this.cardNo = cardNo;
	}

	public Person getPerson() {
		return person;
	}

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

Person:

package com.bjpowernode.hibernate;

public class Person {

	private int id;
	
	private String name;
	
	private IdCard idCard;

	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 IdCard getIdCard() {
		return idCard;
	}

	public void setIdCard(IdCard idCard) {
		this.idCard = idCard;
	}
}

IdCard.hbm.xml

<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.IdCard" table="t_idCard">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="cardNo"/>
		<one-to-one name="person"/>
	</class>
</hibernate-mapping>

Person.hbm.xml

<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Person" table="t_person">
		<id name="id">
			<!-- 采用foreign生成策略,forgeign会取得关联对象的标识 -->
			<generator class="foreign">
				<!-- property只关联对象 -->
				<param name="property">idCard</param>
			</generator>
		</id>
		<property name="name"/>
		<!-- 
			one-to-one指示hibernate如何加载其关联对象,默认根据主键加载
			也就是拿到关系字段值,根据对端的主键来加载关联对象
		
			constrained="true表示,当前主键(person的主键)还是一个外键
			参照了对端的主键(IdCard的主键),也就是会生成外键约束语句
		 -->
		<one-to-one name="idCard" constrained="true"/>
	</class>
</hibernate-mapping>

外键单向关联:(推荐)一对一唯一外键关联映射其实是多对一的特例,采用<many-to-one>标签来映射,指定多的一端unique为true,这样就限制了多的一端的多重性唯一。

对象及实体关系图:


Person:

public class Person {

	private int id;
	
	private String name;
	
	private IdCard idCard;

	public int getId() {
		return id;
	}

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

Person.hbm.xml

<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Person" table="t_person">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<many-to-one name="idCard" unique="true"/>
	</class>
</hibernate-mapping>

IdCard.hbm.xml

<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.IdCard" table="t_idCard">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="cardNo"/>
	</class>
</hibernate-mapping>

外键双向关联:

对象及实体关系图:


IdCard

package com.bjpowernode.hibernate;

public class IdCard {
	
	private int id;
	
	private String cardNo;
	
	private Person person;

	public int getId() {
		return id;
	}

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

Person

package com.bjpowernode.hibernate;

public class Person {

	private int id;
	
	private String name;
	
	private IdCard idCard;

	public int getId() {
		return id;
	}

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

Person.hbm.xml

<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Person" table="t_person">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<many-to-one name="idCard" unique="true"/>
	</class>
</hibernate-mapping>

IdCard.hbm.xml

<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.IdCard" table="t_idCard">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="cardNo"/>
		<one-to-one name="person" property-ref="idCard"/>
	</class>
</hibernate-mapping>

一对多:

一对多关联映射和多对一关联映射映射原理是一致的,都是在多的一端加入一个外键,指向一的一端,所以在一的一端的集合上采用<key>标签,在多的一端加入一个外键,在多的一端采用<many-to-one>标签,设置为inverse为true。例:一个班上多名学生

单向:

对象及实体关系图:


Classes:

package com.bjpowernode.hibernate;

import java.util.Set;

public class Classes {
	
	private int id;
	
	private String name;
	
	private Set students;

	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 getStudents() {
		return students;
	}

	public void setStudents(Set students) {
		this.students = students;
	}
	
}

Student.hbm.xml

<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Student" table="t_student">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
	</class>
</hibernate-mapping>

Classes.hbm.xml

<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Classes" table="t_classes">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<set name="students">
			<!-- 
			<key column="classesid" not-null="true"/>
			 -->
			 <key column="classesid"/>
			<one-to-many class="com.bjpowernode.hibernate.Student"/>
		</set>
	</class>
</hibernate-mapping>

双向:主要是为了主要是为了解决一对多单向关联的缺陷,而不是需求驱动的

对象及实体关系图:


Student

package com.bjpowernode.hibernate;

public class Student {

	private int id;
	
	private String name;
	
	private Classes classes;

	public int getId() {
		return id;
	}

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

Classes

public class Classes {
	
	private int id;
	
	private String name;
	
	private Set students;

	public int getId() {
		return id;
	}

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

Student.hbm.xml

<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Student" table="t_student">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<many-to-one name="classes" column="classesid"/>
	</class>
</hibernate-mapping>

Classes.hbm.xml

<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Classes" table="t_classes">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<set name="students" inverse="true">
			<!-- 
			<key column="classesid" not-null="true"/>
			 -->
			 <key column="classesid"/>
			<one-to-many class="com.bjpowernode.hibernate.Student"/>
		</set>
	</class>
</hibernate-mapping>

一对多和多对一区别:

          * 多对一维护的关系是:多指向一的关系,有了此关系,在加载多的时候可以将一加载上来
 * 一对多维护的关系是:一指向多的关系,有了此关系,在加载一的时候可以将多加载上来

多对多:例-用户和角色关系

单向:

对象及实体关系图:


User

public class User {
	
	private int id;
	
	private String name;

	private Set roles;
	
	public int getId() {
		return id;
	}

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

User.hbm.xml

<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.User" table="t_user">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<set name="roles" table="t_user_role">
			<key column="user_id"/>
			<many-to-many class="com.bjpowernode.hibernate.Role" column="role_id" />
		</set>
	</class>
</hibernate-mapping>

Role.hbm.xml

<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Role" table="t_role">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
	</class>
</hibernate-mapping>

双向:

Role

public class Role {

	private int id;
	
	private String name;
	
	private Set users;
	
	public int getId() {
		return id;
	}

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

User

public class User {
	
	private int id;
	
	private String name;

	private Set roles;
	
	public int getId() {
		return id;
	}

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

Role.hbm.xml

<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Role" table="t_role">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<set name="users" table="t_user_role">
			<key column="role_id" not-null="true"/>
			<many-to-many class="com.bjpowernode.hibernate.User" column="user_id"/>
		</set>
	</class>
</hibernate-mapping>

User.hbm.xml

<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.User" table="t_user">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<set name="roles" table="t_user_role">
			<key column="user_id" not-null="true"/>
			<many-to-many class="com.bjpowernode.hibernate.Role" column="role_id" />
		</set>
	</class>
</hibernate-mapping>

注意:

* 生成的中间表名称必须一样
* 生成的中间表中的字段必须一样





评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值