打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Hibernate 组合映射使用

hibernate知识复习二:组合映射

      假设现在有这样的需求,一个数据表的字段需要包括用户的两个地址,其中一个是家庭地址(Address),包括所在城  市,街道和邮政编码,另一个是办公地址(Mailing Address),也包括同样结构的字段,包括城市,街道和邮政编码,在这种情况下,可以使得组合映射的方式来完成对象关系映射关系。

     首先定义数据表:

Java代码
  1. create table PERSON   
  2. (   
  3.   ID      NUMBER not null,   
  4.   NAME    VARCHAR2(20),   
  5.   CITY    VARCHAR2(50),   
  6.   STREET  VARCHAR2(50),   
  7.   ZIPCODE VARCHAR2(6)   
  8. );   
  9. alter table PERSON   
  10.   add constraint PK_PERSON_ID primary key (ID);  

 

对于这种需求,我们可能有必要把其中的city,street,zipcode提取出来单独组成一个Address类,将这个类作为Person对象的一个组成部分出现。

源代码:Address.java

Java代码
  1. package com.sun.demo;   
  2.   
  3. public class Address {   
  4.   
  5.     private String city;   
  6.   
  7.     private String street;   
  8.   
  9.     private String zipcode;   
  10.        
  11.     public Address() {   
  12.     }   
  13.   
  14.     public Address(String city, String street, String zipcode) {   
  15.         this.city = city;   
  16.         this.street = street;   
  17.         this.zipcode = zipcode;   
  18.     }   
  19.   
  20.     public String getCity() {   
  21.         return city;   
  22.     }   
  23.   
  24.     public void setCity(String city) {   
  25.         this.city = city;   
  26.     }   
  27.   
  28.     public String getStreet() {   
  29.         return street;   
  30.     }   
  31.   
  32.     public void setStreet(String street) {   
  33.         this.street = street;   
  34.     }   
  35.   
  36.     public String getZipcode() {   
  37.         return zipcode;   
  38.     }   
  39.   
  40.     public void setZipcode(String zipcode) {   
  41.         this.zipcode = zipcode;   
  42.     }   
  43.        
  44.     public String toString() {   
  45.         return city + " " + street + " " + zipcode;   
  46.     }   
  47.   
  48. }  

 对象类Person.java定义如下:注意其中将Address作为Person类的属性出现。

源代码:Person.java

Java代码
  1. package com.sun.demo;   
  2.   
  3. public class Person implements java.io.Serializable {   
  4.   
  5.     private Long id;   
  6.   
  7.     private String name;   
  8.   
  9.     private Address address;   
  10.   
  11.     public Person(Long id, String name, Address address) {   
  12.         this.id = id;   
  13.         this.name = name;   
  14.         this.address = address;   
  15.     }   
  16.   
  17.     public Address getAddress() {   
  18.         return address;   
  19.     }   
  20.   
  21.     public void setAddress(Address address) {   
  22.         this.address = address;   
  23.     }   
  24.   
  25.     public Person() {   
  26.     }   
  27.   
  28.     public Person(Long id) {   
  29.         this.id = id;   
  30.     }   
  31.   
  32.     public Long getId() {   
  33.         return this.id;   
  34.     }   
  35.   
  36.     public void setId(Long id) {   
  37.         this.id = id;   
  38.     }   
  39.   
  40.     public String getName() {   
  41.         return this.name;   
  42.     }   
  43.   
  44.     public void setName(String name) {   
  45.         this.name = name;   
  46.     }   
  47. }  

 

上面这种POJO对象的设计,对数据库的表结构并没有任何影响,只是出于程序设计的考虑,增加对象设计的粒度,可以通过Address的设计作为Person对象的一个组件(Component),在映射文件中,我们可以使用<component>标签来完成此种关系的映射。

映射关系文件Person.hbm.xml如下:

源文件:Person.hbm.xml

Xml代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"   
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  4. <hibernate-mapping>  
  5.     <class name="com.sun.demo.Person" table="PERSON" schema="SCOTT">  
  6.         <id name="id" type="long" column="ID">  
  7.             <generator class="assigned" />  
  8.         </id>  
  9.         <property name="name" type="string" column="NAME" />  
  10.         <component name="address" class="com.sun.demo.Address">  
  11.             <property name="city" column="city" type="string" />  
  12.             <property name="street" column="street" type="string" />  
  13.             <property name="zipcode" column="zipcode" type="string" />  
  14.         </component>  
  15.     </class>  
  16. </hibernate-mapping>  

 

如何使用这种组合关系,先看一下存储对象的代码:

Java代码
  1. package com.sun.demo;   
  2.   
  3. import junit.framework.TestCase;   
  4.   
  5. import org.hibernate.Session;   
  6. import org.hibernate.Transaction;   
  7.   
  8. public class TestPerson extends TestCase {   
  9.        
  10.     public void testSavePerson(){   
  11.            
  12.         Person person = new Person();   
  13.         person.setId(1001L);   
  14.         person.setName("peter");   
  15.         Address address = new Address("beijing","changan street","100080");   
  16.         person.setAddress(address);   
  17.            
  18.         Session session = HibernateSessionFactory.getSession();   
  19.         Transaction tx = session.beginTransaction();   
  20.         session.save(person);   
  21.         tx.commit();   
  22.         HibernateSessionFactory.closeSession();   
  23.     }   
  24.   
  25. }  
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Eclipse快速上手Hibernate--6.关联映射(一对一)(1)
Annotation对Hibernate中联合主键定义
初识在Spring Boot中使用JPA
Hibernate树型结构的算法,附源码!
Hibernate4组件映射
在myeclipse下整合spring和hibernate
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服