【hibernate】关联映射那些事----一个小例子
2016-09-11 09:54
441 查看
知识就是不断的重复,上几篇文章我们讲了关联映射的几种关系,关联映射就是由我们来规定实体类之间的的关系,然后hibernate帮助我们做具体的映射。这篇文章我们就来做一个综合的小例子,一方面来回顾一下关联映射,一方面,加深一下印象,因为只是就是不断的重复。
我们先看一下这几个类的关联关系。通过一张类图来看一下。
在这张图中我们定义了一个Person父类。其中父类中还有一个组件属性Address类。另外还有一个Employee类和Customer类分别继承Person类,最后还有一个Manager类是Employee的一个子类。并且最后提到的三个类之间还存在关联关系。
接来下我们定义一下这几个类。
Person类
Address类
Customer类
Employee类
Manager类
在类的定义中我们定义了五个类,仔细分析一下,我们可以看出这五个类实际上都是围绕Person类展开的。首先Address类是Person类的一个组件,我们可以使用组件映射的方式。Customer类和Employee类都是Person类的子类,我们使用joined-subclass继承映射的方式。而Manager类又继承了Employee类。同时Customer类、Employee类、Manager类之间有一对多的关系。所以我们使用一个Person类的映射文件来表示这些类之间的关系。
下面就是Person类的映射文件
<?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 >
<!-- 映射Person类 -->
<class name="com.hibernate.test.Person"
table="t_person" >
<!-- 映射主键 -->
<id name="id" column="person_id">
<generator class="identity" />
</id>
<!-- 映射基本属性 -->
<property name="name" />
<property name="sex" />
<!-- 映射一个组件属性 -->
<component name="address">
<property name="detail" />
<property name="zip" />
<property name="country" />
</component>
<!-- 使用joined-subclss元素映射Person的子类Employee类 -->
<joined-subclass name="com.hibernate.test.Employee" >
<!-- 使用key映射父子类共有主键,key关键字表示使用主类的标识主键来作为自己的主键 -->
<key column="employee_id" />
<!-- 映射两个基本属性 -->
<property name="title"/>
<property name="salary"/>
<!-- 映射Employee和Manager之间的N-1关联关系 -->
<many-to-one name="manager" column="manager_id"/>
<!-- 映射Employee与Customer之间的1-N关联关系 -->
<set name="customers" inverse="true">
<key column="manager_id"/>
<one-to-many class="com.hibernate.test.Customer" />
</set>
</joined-subclass>
<!-- 映射Manager类 -->
<joined-subclass name="com.hibernate.test.Manager">
<key column="manager_id" />
<property name="department"/>
<!-- 映射Employee与manager类之间的1-N关系-->
<set name="employees" inverse="true">
<key column="manager_id" />
<one-to-many class="com.hibernate.test.Employee" />
</set>
</joined-subclass>
<!-- 映射Customer类 -->
<joined-subclass name="com.hibernate.test.Customer" >
<!-- 使用父类的主键 -->
<key column="customer_id"/>
<property name="comments" />
<!-- 映射employee与customer类之间的1-N关联 -->
<many-to-one name="employee" column="employee_id" not-null="true" />
</joined-subclass>
</class>
</hibernate-mapping>
小结
在上面的小例子中用到了继承映射,一对多映射,多对一映射和组件映射.虽然没有涵盖所有的映射关系,但是很多事情都是举一反三的,通过对知识的不断重复,从而加深我们对于知识的印象,从而让我们能够更好的掌握这些知识。不断的进步。
我们先看一下这几个类的关联关系。通过一张类图来看一下。
在这张图中我们定义了一个Person父类。其中父类中还有一个组件属性Address类。另外还有一个Employee类和Customer类分别继承Person类,最后还有一个Manager类是Employee的一个子类。并且最后提到的三个类之间还存在关联关系。
接来下我们定义一下这几个类。
Person类
package com.hibernate.test; public class Person { private Integer id; private String name; private String sex; public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } //Person实体的组件属性 private Address address; public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } 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; } }
Address类
package com.hibernate.test; public class Address { private String detail; private String zip; private String country; public String getDetail() { return detail; } public void setDetail(String detail) { this.detail = detail; } public String getZip() { return zip; } public void setZip(String zip) { this.zip = zip; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } //初始化全部属性的构造器 public Address(String detail, String zip, String country) { super(); this.detail = detail; this.zip = zip; this.country = country; } }
Customer类
package com.hibernate.test; public class Customer extends Person{ private String comments; //和员工保持关联关系的属性 private Employee employee; public Employee getEmployee() { return employee; } public Customer(String comments) { super(); this.comments = comments; } public void setEmployee(Employee employee) { this.employee = employee; } public String getComments() { return comments; } public void setComments(String comments) { this.comments = comments; } }
Employee类
package com.hibernate.test; import java.util.HashSet; import java.util.Set; public class Employee extends Person { private String title; private String salary; //和顾客保持关联关系的属性 private Set<Customer> customers= new HashSet<Customer>(); //和经理保持关联关系的属性 private Manager manager; public Manager getManager() { return manager; } public void setManager(Manager manager) { this.manager = manager; } public Set<Customer> getCustomers() { return customers; } public void setCustomers(Set<Customer> customers) { this.customers = customers; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getSalary() { return salary; } public void setSalary(String salary) { this.salary = salary; } }
Manager类
package com.hibernate.test; import java.util.HashSet; import java.util.Set; public class Manager { private String department; //和员工保持关联关系的属性 private Set<Employee> customers= new HashSet<Employee>(); public String getDepartment() { return department; } public void setDepartment(String department) { this.department = department; } public Set<Employee> getCustomers() { return customers; } public void setCustomers(Set<Employee> customers) { this.customers = customers; } }
在类的定义中我们定义了五个类,仔细分析一下,我们可以看出这五个类实际上都是围绕Person类展开的。首先Address类是Person类的一个组件,我们可以使用组件映射的方式。Customer类和Employee类都是Person类的子类,我们使用joined-subclass继承映射的方式。而Manager类又继承了Employee类。同时Customer类、Employee类、Manager类之间有一对多的关系。所以我们使用一个Person类的映射文件来表示这些类之间的关系。
下面就是Person类的映射文件
<?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 >
<!-- 映射Person类 -->
<class name="com.hibernate.test.Person"
table="t_person" >
<!-- 映射主键 -->
<id name="id" column="person_id">
<generator class="identity" />
</id>
<!-- 映射基本属性 -->
<property name="name" />
<property name="sex" />
<!-- 映射一个组件属性 -->
<component name="address">
<property name="detail" />
<property name="zip" />
<property name="country" />
</component>
<!-- 使用joined-subclss元素映射Person的子类Employee类 -->
<joined-subclass name="com.hibernate.test.Employee" >
<!-- 使用key映射父子类共有主键,key关键字表示使用主类的标识主键来作为自己的主键 -->
<key column="employee_id" />
<!-- 映射两个基本属性 -->
<property name="title"/>
<property name="salary"/>
<!-- 映射Employee和Manager之间的N-1关联关系 -->
<many-to-one name="manager" column="manager_id"/>
<!-- 映射Employee与Customer之间的1-N关联关系 -->
<set name="customers" inverse="true">
<key column="manager_id"/>
<one-to-many class="com.hibernate.test.Customer" />
</set>
</joined-subclass>
<!-- 映射Manager类 -->
<joined-subclass name="com.hibernate.test.Manager">
<key column="manager_id" />
<property name="department"/>
<!-- 映射Employee与manager类之间的1-N关系-->
<set name="employees" inverse="true">
<key column="manager_id" />
<one-to-many class="com.hibernate.test.Employee" />
</set>
</joined-subclass>
<!-- 映射Customer类 -->
<joined-subclass name="com.hibernate.test.Customer" >
<!-- 使用父类的主键 -->
<key column="customer_id"/>
<property name="comments" />
<!-- 映射employee与customer类之间的1-N关联 -->
<many-to-one name="employee" column="employee_id" not-null="true" />
</joined-subclass>
</class>
</hibernate-mapping>
小结
在上面的小例子中用到了继承映射,一对多映射,多对一映射和组件映射.虽然没有涵盖所有的映射关系,但是很多事情都是举一反三的,通过对知识的不断重复,从而加深我们对于知识的印象,从而让我们能够更好的掌握这些知识。不断的进步。
相关文章推荐
- Hibernate框架学习之四:关联映射那些事
- hibernate级联操 同时向2张表插入数据(一对多的关联,一个简单的例子说明)
- 【hibernate】关联映射那些事(三)----双向映射
- hibernate级联操 同时向2张表插入数据(一对多的关联,一个简单的例子说明)
- hibernate级联操 同时向2张表插入数据(一对多的关联,一个简单的例子说明)
- hibernate级联操 同时向2张表插入数据(一对多的关联,一个简单的例子说明)
- hibernate中映射blob数据类型的一个例子
- hibernate级联操 同时向2张表插入数据(一对多的关联,一个简单的例子说明)
- hibernate级联操 同时向2张表插入数据(一对多的关联,一个简单的例子说明)
- hibernate级联操 同时向2张表插入数据(一对多的关联,一个简单的例子说明)
- hibernate级联操 同时向2张表插入数据(一对多的关联,一个简单的例子说明)
- hibernate级联操 同时向2张表插入数据(一对多的关联,一个简单的例子说明)
- hibernate级联操 同时向2张表插入数据(一对多的关联,一个简单的例子说明)
- 【hibernate】关联映射那些事(四)----继承映射
- Hibernate Component映射的一个简单例子
- hibernate级联操 同时向2张表插入数据(一对多的关联,一个简单的例子说明)
- hibernate级联操 同时向2张表插入数据(一对多的关联,一个简单的例子说明)
- hibernate映射一对多,双向关系[关联自身],初学例子四
- Hibernate写的一个computer管理例子
- 一个完整的hibernate的one-to-many的例子