组件的映射也不常见,把对象粒度分的更细了,但是组件和宿主还是在一张表里,这样更加面向对象了,注意配置id的配置选项,组件需实现序列化接口
1,Employee.java
package com.model;
import java.io.Serializable;
public class Employee implements Serializable{
private EmployeeId employeeId;
private String address;
private int age;
public EmployeeId getEmployeeId() {
return employeeId;
}
public void setEmployeeId(EmployeeId employeeId) {
this.employeeId = employeeId;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2,EmployeeId.java
package com.model;
import java.io.Serializable;
public class EmployeeId implements Serializable{
private String empNo;
private String empName;
public String getEmpNo() {
return empNo;
}
public void setEmpNo(String empNo) {
this.empNo = empNo;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
}
3,Employee.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.model">
<class name="Employee" table="employee">
<composite-id class="EmployeeId" name="employeeId">
<key-property name="empNo"></key-property>
<key-property name="empName"></key-property>
</composite-id>
<property name="address" column="address"></property>
<property name="age" column="age"></property>
</class>
</hibernate-mapping>
4,单元测试
@Test
public void testEmployee(){
Session s = HibernateUtil.getInstance().getSession();
s.beginTransaction();
//添加员工
EmployeeId eid = new EmployeeId();
eid.setEmpNo("02");
eid.setEmpName("name02");
Employee e = new Employee();
e.setEmployeeId(eid);
e.setAddress("sdfdf");
e.setAge(20);
s.save(e);
//查询员工
EmployeeId eid2 = new EmployeeId();
eid2.setEmpNo("01");
eid2.setEmpName("name01");
Employee employee = (Employee) s.load(Employee.class, eid2);
System.out.println(employee.getAddress());
s.getTransaction().commit();
s.close();
}
5,输出结果
sdfdf
Hibernate: insert into employee (address, age, empNo, empName) values (?, ?, ?, ?)
6,如果不是主键的组件,只需要变动一下映射文件里的配置如下
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.model">
<class name="Employee" table="employee">
<!-- <composite-id class="EmployeeId" name="employeeId">
<key-property name="empNo"></key-property>
<key-property name="empName"></key-property>
</composite-id> -->
<id column="id" name="id">
<generator class="native"></generator>
</id>
<component name="employeeId" class="EmployeeId">
<property name="empNo" column="empNo"></property>
<property name="empName" column="empName"></property>
</component>
<property name="address" column="address"></property>
<property name="age" column="age"></property>
</class>
</hibernate-mapping>