Hibernate入门:关联规则之多对一和一对多

多对一规则:比如Employee和Department,多个Employee对应一个Department,称为多对一;
一对多规则:比如Department和Employee,一个Department对应多个Employee,称为一对多;


一对多的规则:

public class Department {
	private int id;
	private String name;
	private Set<Employee> emps;	//此为一对多 
	getter setter...
}



public class Employee {
	private int id;
	private String name;
	getter setter...
}


在Department.hbm.xml中设置:

<set name="emps">
        <key column="depart_id"></key>	<!-- 因为集合属性不可能存储在这张表中,需要另开一张表,所以需要指定存储此集合的表用于连接department表的id属性的外键 -->
        <!-- depart_id为Employee表中需要和Department表的id相关联的属性 -->
        <one-to-many class="Employee"/><!-- 指定一对多对应的表 -->
</set>

一对多规则设置以后,在Department中是没有任何变化的,变化是在Employee中多出了一个depart_id属性;


多对一规则:


public class Department {
	private int id;
	private String name;
	getter setter...
}


package org.xiazdong;

public class Employee {
	private int id;
	private Department depart;	//此为多对一,通过Department对象引用Department
	private String name;
	getter setter...
}

Employee.hbm.xml中设置:

<many-to-one name="depart" column="depart_id" />	<!-- 设置在Employee中有一个depart_id和Department的主键相关联-->


实例:


Employee.java

package org.xiazdong;

public class Employee {
	private int id;
	private Department depart;	//此为多对一
	private String name;
	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 Department getDepart() {
		return depart;
	}
	public void setDepart(Department depart) {
		this.depart = depart;
	}
}

Department.java


package org.xiazdong;

import java.util.Set;

public class Department {
	private int id;
	private String name;
	private Set<Employee> emps;	//此为一对多
	 
	public Set<Employee> getEmps() {
		return emps;
	}
	public void setEmps(Set<Employee> emps) {
		this.emps = emps;
	}
	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;
	}
	
}

Employee.hbm.xml


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2012-5-17 10:59:47 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping package="org.xiazdong">
	<class name="Employee">
		<id name="id">
			<generator class="native" />
		</id>
		<property name="name" />
		<many-to-one name="depart" column="depart_id" />
	</class>
</hibernate-mapping>


Department.hbm.xml


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2012-5-17 10:59:47 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping package="org.xiazdong">
    <class name="Department">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        
        <set name="emps">
        	<key column="depart_id"></key>	<!-- 因为集合属性不可能存储在这张表中,需要另开一张表,所以需要指定存储此集合的表用于连接department表的id属性的外键 -->
        	<!-- depart_id为Employee表的主键,和Department表的id相关联 -->
        	<one-to-many class="Employee"/><!-- 指定一对多对应的表 -->
        </set>
    </class>
</hibernate-mapping>

执行后表为:

Department


Employee



测试类:

package test;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.util.HibernateUtil;
import org.xiazdong.Department;
import org.xiazdong.Employee;

public class Many2OneTest {
	public static void main(String[] args) {
		add();
		query();
	}
	static void query(){
		Session session = HibernateUtil.getSession();
		Transaction tx = session.beginTransaction();
		Department depart = (Department) session.get(Department.class, 6);
		Employee e = (Employee) session.get(Employee.class, 8);
		System.out.println(depart.getEmps());
		System.out.println(e.getDepart().getName());
		tx.commit();
		session.close();
	}
	static void add(){
		Department depart = new Department();
		depart.setName("depart");
		Employee e1 = new Employee();
		e1.setName("e1");
		e1.setDepart(depart);
		Employee e2 = new Employee();
		e2.setName("e2");
		e2.setDepart(depart);
		
		Session session = HibernateUtil.getSession();
		Transaction tx = session.beginTransaction();
		session.save(depart);
		session.save(e1);
		session.save(e2);
		tx.commit();
		session.close();
	}
}






原文地址:https://www.cnblogs.com/xiazdong/p/3058020.html