package com.ethan.domain;
public class Employee {
private Integer id;
private String name;
//如果是departId,还得再查一次,才可以得到department对象信息,一种对象导航
private Department depart;
public Integer getId() {
return id;
}
public void setId(Integer 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 department) {
this.depart = department;
}
@Override
public String toString() {
return "id="+id+"\tname="+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="com.ethan.domain">
<class name="Employee">
<id name="id">
<generator class="native"/>
</id>
<!-- name unique -->
<property name="name"/>
<!-- departId外键参考department表 -->
<many-to-one name="depart" column="departId"/>
</class>
</hibernate-mapping>
package com.ethan.domain;
import java.util.HashSet;
import java.util.Set;
public class Department {
private Integer id;
private String name;
private Set<Employee> emps = new HashSet<Employee>();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Employee> getEmps() {
return emps;
}
public void setEmps(Set<Employee> emps) {
this.emps = emps;
}
}
<?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="com.ethan.domain">
<class name="Department">
<id name="id">
<generator class="native"></generator>
</id>
<!-- name unique -->
<property name="name"/>
<!-- 如果是delete,那么部门删除时,它下边的员工也会跟着删除 -->
<set name="emps" inverse="true" cascade="save-update">
<key column="departId"></key>
<one-to-many class="Employee"/>
</set>
</class>
</hibernate-mapping>
package com.ethan.hibernate;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.ethan.domain.Department;
import com.ethan.domain.Employee;
import com.ethan.hibernate.util.HibernateUtil;
public class Many2One {
public static void add() {
Session s = null;
Transaction tx = null;
try {
Department depart = new Department();
depart.setName("ddd");
Employee emp = new Employee();
//建立对象关联,产出update语句
emp.setDepart(depart);
emp.setName("eeee");
Employee emp2 = new Employee();
//建立对象关联 产出update语句
emp2.setDepart(depart);
emp2.setName("eeee2");
Set<Employee> emps = new HashSet<Employee>();
emps.add(emp);
emps.add(emp2);
//会多两条update, update employee departId
//对象模型映射关联
//设置了inverse="true"之后,不会产生update语句了
depart.setEmps(emps);
s = HibernateUtil.getSession();
tx = s.beginTransaction();
//如果映射文件没设置,这里又注释了,则会出异常,因为emp拿不到depart的id去给depart_id插入
//设置了cascade,(还是)会多两条update语句
//下边会产生四条update语句,什么也还没设置
/*s.save(emp);
s.save(emp2);*/
s.save(depart);
/*先保存一方,则只有两条update
* s.save(depart);
* s.save(emp);
s.save(emp2);
*/
//注释了下面两句,就会报瞬时对象未保存,如果设置了cascade就好了
/*s.save(emp);
s.save(emp2);*/
//--------------------------------------
/*//这种保存顺序,会多一条更新语句,如果先保存多方
//<many-to-one name="depart" column="departId" not-null="true"/>
//设置后,会报非空约束,departId --->NULL
s.save(emp);
//emp,depart持久态了,会感知到变化
s.save(depart);*/
tx.commit();
} finally {
if(s!=null) {
s.close();
}
}
}
public static Employee query(int empId) {
Session s = null;
Transaction tx = null;
try {
s = HibernateUtil.getSession();
tx = s.beginTransaction();
// Employee emp = (Employee) s.get(Employee.class, empId);
//两条查询 语句
Employee emp = (Employee) s.load(Employee.class, empId);
System.out.println(emp.getDepart().getName());
tx.commit();
return emp;
} finally {
if(s!=null) {
s.close();
}
}
}
}
package com.ethan.test;
import static org.junit.Assert.*;
import org.junit.Test;
import com.ethan.domain.Employee;
import com.ethan.hibernate.Many2One;
public class TestMany2One {
@Test
public void add() {
Many2One.add();
}
@Test
public void query() {
Employee emp = Many2One.query(2);
//System.out.println(emp);
}
}