首页 > 代码库 > hibernate关联关系映射

hibernate关联关系映射

    本文将介绍hibernate的几种关联关系映射:多对一、一对一、一对多、多对多。

多对一

以用户和组为例,假设多个用户对应一个组,用户即为多的一端,组即为一的一端。

关键代码和配置:

用户:

public class User implements Serializable {

	private static final long serialVersionUID = 1L;

	private Long id;
	private String name;
	private Group group;

	public Long getId() {
		return id;
	}

	public void setId(Long 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;
	}

}
<hibernate-mapping package="com.ado.test.hibernate.po">
	<class name="User" table="t_user">
		<id name="id" column="id" type="long">
			<generator class="increment" />
		</id>
		<property name="name" column="name" />
		<!-- cascade="all" fetch="join" -->
		<many-to-one name="group" column="groupid" />
	</class>
</hibernate-mapping>

组:

public class Group implements Serializable {

	private static final long serialVersionUID = 1L;

	private Long id;
	private String name;

	public Long getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

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

}
<hibernate-mapping package="com.ado.test.hibernate.po">
	<class name="Group" table="t_group">
		<id name="id" column="id" type="long">
			<generator class="increment" />
		</id>
		<property name="name" column="name" />
	</class>
</hibernate-mapping>

一对一

以人和身份证号为例,一个人对应一个身份证号。

使用<many-to-one>实现一对一

关键代码和配置:

人:

public class Person implements Serializable {

	private static final long serialVersionUID = 1L;

	private Long id;
	private String name;
	private IdCard idCard;

	public Long getId() {
		return id;
	}

	public String getName() {
		return name;
	}

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

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

	public IdCard getIdCard() {
		return idCard;
	}

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

}
<hibernate-mapping package="com.ado.test.hibernate.po.one2one">
	<class name="Person" table="t_person1">
		<id name="id" column="id" type="long">
			<generator class="increment" />
		</id>
		<property name="name" column="name" />
		<many-to-one name="idCard" column="cardid" />
	</class>
</hibernate-mapping>

身份证号:

public class IdCard implements Serializable {

	private static final long serialVersionUID = 1L;

	private Long id;
	private String name;

	public Long getId() {
		return id;
	}

	public String getName() {
		return name;
	}

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

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

}
<hibernate-mapping package="com.ado.test.hibernate.po.one2one">
	<class name="IdCard" table="t_idcard">
		<id name="id" column="id" type="long">
			<generator class="increment" />
		</id>
		<property name="name" column="name" />
	</class>
</hibernate-mapping>

使用<one-to-one>实现一对一

代码可参考上一小节内容,这里只列出关键配置:

人:

<hibernate-mapping package="com.ado.test.hibernate.po.one2oneforeign">
	<class name="Person" table="t_person2">
		<id name="id" column="id" type="long">
			<generator class="foreign">
				<param name="property">idCard</param>
			</generator>
		</id>
		<property name="name" column="name" />
		<one-to-one name="idCard" />
	</class>
</hibernate-mapping>

身份证号:

<hibernate-mapping package="com.ado.test.hibernate.po.one2oneforeign">
	<class name="IdCard" table="t_idcard2">
		<id name="id" column="id" type="long">
			<generator class="increment" />
		</id>
		<property name="name" column="name" />
	</class>
</hibernate-mapping>

一对多

以班级和学生为例,一个班级有多个学生,即班级为一的一端,学生为多的一端。

关键代码和配置:

班级:

public class Classes implements Serializable {
	private static final long serialVersionUID = 1L;
	private Long id;
	private String name;

	private Set<Student> students;

	public Long getId() {
		return id;
	}

	public String getName() {
		return name;
	}

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

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

	public Set<Student> getStudents() {
		return students;
	}

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

}
<hibernate-mapping package="com.ado.test.hibernate.po.one2many">
	<class name="Classes" table="t_class">
		<id name="id" column="id" type="long">
			<generator class="increment" />
		</id>
		<property name="name" column="name" />
		<set name="students" <span style="color:#ff0000;">inverse="true"</span>>
			<key column="classid" not-null="true" />
			<one-to-many class="Student" />
		</set>
	</class>
</hibernate-mapping>

注意:上面的配置中,增加了inverse="true"属性,可以避免保存Classes时,生成update语句维护映射关系(update t_student)。设置该属性后,保存数据时,要注意顺序,否则外键可能被设置空值。

学生:

public class Student implements Serializable {
	private static final long serialVersionUID = 1L;
	private Long id;
	private String name;

	public Long getId() {
		return id;
	}

	public String getName() {
		return name;
	}

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

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

}
<hibernate-mapping package="com.ado.test.hibernate.po.one2many">
	<class name="Student" table="t_student">
		<id name="id" column="id" type="long">
			<generator class="increment" />
		</id>
		<property name="name" column="name" />
	</class>
</hibernate-mapping>





hibernate关联关系映射