hibernate学习笔记4

Domain Object限制

1.必须有默认的构造方法

2.有无意义的标示符id(键)(可选)

3.非final的类,对懒加载有影响(可选)

----------------------------------------------------------------------------------------------------------------------------------------

关联映射

多对一(Employee - Department)

一对多(Department -Employee)

一对一(Person - IdCard)

多对多(teacher - student)

主键组件映射(User - Name)

集合映射(set,list,map,bag)

inverse和cascade(Employee - Department)

----------------------------------------------------------------------------------------------------------------------------------------

多对一(Employee - Department)

在Employee类中添加私有的Department属性

public class Employee {
private int employeeId;
private String employeeName;
private Department depart;
}

public class Department {
private int departmentId;
private String departmentName;
}

----------------------------------------------------------------------------------------------------------------------------------------

在Employee.hbm.xml中映射文件<many-to-one name="depart" column="depart_id">

默认外键是另一张表的主键,也可以指定为其他的唯一键 property-ref=“”;column属性可以不写,指定表中字段名,默认为对象中对应的名字。

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">
<hibernate-mapping 
package="hibernate.domain">


<class name="Employee" table="Employee" >
<id name="employeeId" column="employee_id" type="java.lang.Integer">
<generator class="native">
<param name="sequence">employee_sequence</param>
</generator>
</id>

<property name="employeeName" column="employee_name" type="java.lang.String" unique-key="true"/>
<many-to-one name="depart" column="depart_id"></many-to-one>
</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">
<hibernate-mapping 
package="hibernate.domain">


<class name="Department" table="department" >
<id name="departmentId" column="depart_id" type="java.lang.Integer">
<generator class="native">
<param name="sequence">department_sequence</param> 
</generator>
</id>

<property name="departmentName" column="depart_name" type="java.lang.String" unique-key="true"/>
</class>

</hibernate-mapping>

----------------------------------------------------------------------------------------------------------------------------------------

测试方法

public static Department add() {
Session s = null;
Transaction ts = null;
try {
Department depart = new Department();
depart.setDepartmentName("depart name");
Employee emp = new Employee();
emp.setEmployeeName("emp name");
emp.setDepart(depart);

s = HibernateUtil.getSession();
ts = s.beginTransaction();
s.save(depart);
s.save(emp);
ts.commit();
return depart;
} finally {
if (s != null)
s.close();
}
}

----------------------------------------------------------------------------------------------------------------------------------------

控制台显示

Hibernate: select department_sequence.nextval from dual
Hibernate: select employee_sequence.nextval from dual
Hibernate: insert into department (depart_name, depart_id) values (?, ?)
Hibernate: insert into Employee (employee_name, depart_id, employee_id) values (?, ?, ?)

----------------------------------------------------------------------------------------------------------------------------------------

根据职员的id查询他所属的部门

public static Employee query(int empId) {
Session s = null;
Transaction ts = null;
try {
s = HibernateUtil.getSession();
ts = s.beginTransaction();
Employee emp = (Employee) s.get(Employee.class, empId);

Hibernate.initialize(emp.getDepart());
//这里出现懒加载的形式,如果不写这一句,则在返回的数据中只有员工的信息,没有员工所属部门的信息

ts.commit();

return emp;

} finally {
if (s != null)
s.close();
}
}

----------------------------------------------------------------------------------------------------------------------------------------

一对多(Department -Employee)

在一对多的关系中,通过部门获取他所有的员工信息,需要在Department类中添加一个Set集合保存员工信息。

在department.hbm.xml文件中写入

<set name="emps">
<!-- 表示外键 -->
<key column="depart_id"/>
<!-- 表示对应的对象 -->
<one-to-many class="Employee" />
</set>

----------------------------------------------------------------------------------------------------------------------------------------

测试方法

public static Department queryDepart(int departId) {
Session s = null;
try {
s = HibernateUtil.getSession();
Department depart = (Department) s.get(Department.class, departId);
Hibernate.initialize(depart.getEmps());
return depart;
} finally {
if (s != null)
s.close();
}
}

----------------------------------------------------------------------------------------------------------------------------------------

控制台显示

Hibernate: select department0_.depart_id as depart1_1_0_, department0_.depart_name as depart2_1_0_ from department department0_ where department0_.depart_id=?
Hibernate: select emps0_.depart_id as depart3_1_, emps0_.employee_id as employee1_1_, emps0_.employee_id as employee1_2_0_, emps0_.employee_name as employee2_2_0_, emps0_.depart_id as depart3_2_0_ from Employee emps0_ where emps0_.depart_id=?
emp1 name
emp2 name

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值