ORM数据映射
-掌握单边的一对多的数据关联
-掌握单边的多对一的数据关联
-掌握双边的多对一的数据关联
-掌握一对一的数据关联
-掌握多对多的数据关联
ORM映射
(Object Relational Mapping),是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。在MyBatis中的笔记中已经讲过。
由于ORM是将数据库中的数据与Java中的对象进行映射转换的,因此当数据表与数据表产生关联时,映射在Java中的对象也需要产生关联,大致可以分为如下几种情况:
单边的多对一关联
单边的一对多关联
双边的多对一关联
一对一关联
多对多关联
单边的多对一关联
emp表和dep表在java中的描述
public class Employee {
private int empId;
private String firstName;
private String lastName;
private double salary;
//多对一映射关联
private Department dep;
。。。。。。
public class Department {
private int depId;
private String depName;
。。。。。
在配置文件中的映射关联
<class name="com.niit.pojo.Employee" table="emp">
<id name="empId" column="employee_id">
<!-- 主键生成的策略 -->
<generator class="sequence">
<param name="sequence">empId</param>
</generator>
</id>
<property name="firstName" column="first_name"></property>
<property name="lastName" column="last_name"></property>
<property name="salary" column="salary"></property>
<!-- 配置多对一映射 -->
<!-- name表示映射类的属性 -->
<many-to-one name="dep" fetch="select">
<!-- 表示映射对象对应的外键 -->
<column name="department_id"></column>
</many-to-one>
</class>
使用fetch属性可以设定查询的方式,默认为select
select 表示使用多条语句分批执行查询
join 表示使用join关键字进行表联接查询
具体操作
public static void main(String[] args) {
// TODO Auto-generated method stub
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Employee emp = (Employee) session.get(Employee.class, 198);
if(emp != null){
System.out.println(emp.getFirstName()+"\t"+emp.getLastName());
System.out.println(emp.getDep().getDepName());
}
//当进行级联对象查询时,session不能关闭
session.close();
}
单边的一对多关联
dep表和emp表在Java中的描述
public class Department {
private int depId;
private String depName;
//一对多关联映射
private Set<Employee> emps;
。。。。。。
public class Employee {
private int empId;
private String firstName;
private String lastName;
private double salary;
。。。。。。
在配置文件中的映射关联
<hibernate-mapping>
<class name="com.niit.pojo.Department" table="dep">
<id name="depId" column="department_id"></id>
<property name="depName" column="department_name"></property>
<!-- 配置一对多映射 -->
<!-- name表示集合的属性名,table表示集合映射的数据表 -->
<!-- inverse表示对该表的持久化权限转交给该表映射的实体类 -->
<!-- cascade表示级联操作 -->
<set name="emps" table="emp" inverse="true" cascade="delete">
<!-- column表示集合映射表与主表的关联外键 -->
<key column="department_id"></key>
<!-- class表示根据外键查询后映射的实体类 -->
<one-to-many class="com.niit.pojo.Employee"/>
</set>
</class>
</hibernate-mapping>
inverse即反转,默认情况下当前表拥有自身的控制权,inverse一旦设为true即表示控制权转下关联的表,只能通过关联表才能操纵这部分数据,inverse只能在集合中使用。
cascade表示级联操作,使用cascade可以实现级联删除。
cascade的值
all 所有操作都使用级联
none 不实现级联 默认值
save-update 在新增和更新时使用级联
delete 在删除时使用级联
可以使用逗号同时使用多个cascade值
具体操作
public static void main(String[] args) {
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Transaction tran = session.beginTransaction();
Department dep = (Department) session.get(Department.class, 30);
//借助于cascade功能,在删除主表数据前先删除子表引用的数据
session.delete(dep);
tran.commit();
session.close();
}
双边的多对一关联
不管单边的一对多还是多对一,都只能局限在当前的一个对象中查询另一个对象,如果希望两个关联的对象都能互相查询就需要两边都进行配置,因此单边一对多和多对一的配置结合就是双边的一对多,也可以称为双边多对一的关联。
(也就是嵌套起来)
一对一关联
多对多关联
如果数据表中只是描述对象的详细信息,而两表的关系需要通过第三张表来关联的,这就是多对多的关联
<class name="com.niit.pojo.Employee" table="emp">
<id name="empId" column="employee_id">
<!-- 主键生成的策略 -->
<generator class="sequence">
<param name="sequence">empId</param>
</generator>
</id>
<property name="firstName" column="first_name"></property>
<property name="lastName" column="last_name"></property>
<property name="salary" column="salary"></property>
<!-- 配置多对多映射 -->
<set name="customers" table="orders">
<key column="empid"></key>
<many-to-many column="customerid" class="com.niit.pojo.Customer"></many-to-many>
</set>
</class>
<class name="com.niit.pojo.Customer" table="customer">
<id name="cId" column="customerid"></id>
<property name="cName" column="customerName"></property>
<!-- 配置多对多 -->
<set name="emps" table="orders">
<key column="customerid"></key>
<many-to-many column="empid" class="com.niit.pojo.Employee"></many-to-many>
</set>
</class>
SET标签中的table 表示 在第三张表引用的表名
key column表示当前表在第三张表中的列名
many-to-many column 表示在set集合在当前表中对应的列名
class 表示该列在JAVA对象中的对象名
public static void main(String[] args) {
// TODO Auto-generated method stub
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Employee emp = (Employee) session.get(Employee.class, 198);
System.out.println(emp.getFirstName());
System.out.println(emp.getCustomers().size());
//System.out.println(emp.getCustomerSet().size());
System.out.println(emp.getOrders().size());
for(Order order : emp.getOrders()){
System.out.println(order.getOrderId()+"\t"+order.getCustomer().getcName()+"\t"+order.getCustomer().getEmps().size());
}
//获取orders表对象
//Order order = (Order) session.get(Order.class, 100);
// System.out.println(order.getEmp().getEmpId());
// System.out.println(order.getCustomer().getcId());
session.close();
}