关联关系
多对一关系
员工与部门的关系 从员工角度 是多对一的关系 那么在员工的实体类中加上部门的属性即可
package vo.util.bean;
/**
* 员工类
* @author Administrator
*
*/
public class Employee {
private int id;
private String name;
private Department derpartment;
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 getDerpartment() {
return derpartment;
}
public void setDerpartment(Department derpartment) {
this.derpartment = derpartment;
}
}
映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
package="vo.util.bean">
<class name="Employee">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="derpartment" column="depaer_id"/>
</class>
</hibernate-mapping>
部门类
package vo.util.bean;
/**
* 部门类
* @author Administrator
*
*/
public class Department {
private int id;
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;
}
}
映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
package="vo.util.bean">
<class name="Department">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
测试类
package vo.util.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import vo.util.HibernateUtil;
import vo.util.bean.Department;
import vo.util.bean.Employee;
public class ManytoOne {
/**
* @param args
*/
public static void main(String[] args) {
// add();
query(1);
}
static Department add(){
Session session = null;
Transaction tx = null;
try{
session =HibernateUtil.getSession();
tx = session.beginTransaction();
//…你的代码save,delete,update,get…
Department dpart=new Department();
dpart.setName("BSM部门");
Employee em=new Employee();
em.setName("员工许春荣");
em.setDerpartment(dpart);
session.save(dpart);
session.save(em);
tx.commit();
return dpart;
}finally{
if(session != null)session.close();
}
}
static Employee query(int id){
Session session=null;
try{
session=HibernateUtil.getSession();
Employee em=(Employee)session.get(Employee.class, id);
System.out.println(em.getDerpartment().getName());
return em;
}finally{
if(session != null)session.close();
}
}
}
总结:根据测试后的结果分析 发现我们可以在查询一个员工的信息,同时也可以把部门的信息给查
找出来,在员工的映射文件中,利用其many-to-one标签 就可以把员工的关系给映射上,在这种多对一的关系的数据录入
时候,必须先录入主实体类的数据,然后才录入从录入实体的数据,如果先录入从实体然后才主实体的数据,会在hibernate
的执行过程中,产生两条插入语句 一条更新语句 一条插入语句是插入的是从实体的值 但是对于其关联关系的那个外键会是空值
然后插入主实体的数据,最后更新其从实体的外键数据,这时的外键数据就是有值的了 但是我们一般在设计的时候,一般规定
外键关系是不能为空的,那么这样操作会报非空异常错误
end 完毕!