您的位置:首页 > 其它

【hibernate】关联映射那些事----一个小例子

2016-09-11 09:54 441 查看
       知识就是不断的重复,上几篇文章我们讲了关联映射的几种关系,关联映射就是由我们来规定实体类之间的的关系,然后hibernate帮助我们做具体的映射。这篇文章我们就来做一个综合的小例子,一方面来回顾一下关联映射,一方面,加深一下印象,因为只是就是不断的重复。

        我们先看一下这几个类的关联关系。通过一张类图来看一下。

        


        在这张图中我们定义了一个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>

小结

             在上面的小例子中用到了继承映射,一对多映射,多对一映射和组件映射.虽然没有涵盖所有的映射关系,但是很多事情都是举一反三的,通过对知识的不断重复,从而加深我们对于知识的印象,从而让我们能够更好的掌握这些知识。不断的进步。

        

  

     
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐