假設現(xiàn)在有這樣的需求,一個數(shù)據(jù)表的字段需要包括用戶的兩個地址,其中一個是家庭地址(Address),包括所在城 市,街道和郵政編碼,另一個是辦公地址(Mailing Address),也包括同樣結(jié)構(gòu)的字段,包括城市,街道和郵政編碼,在這種情況下,可以使得組合映射的方式來完成對象關系映射關系。
首先定義數(shù)據(jù)表:
- create table PERSON
- (
- ID NUMBER not null,
- NAME VARCHAR2(20),
- CITY VARCHAR2(50),
- STREET VARCHAR2(50),
- ZIPCODE VARCHAR2(6)
- );
- alter table PERSON
- add constraint PK_PERSON_ID primary key (ID);
create table PERSON(ID NUMBER not null,NAME VARCHAR2(20),CITY VARCHAR2(50),STREET VARCHAR2(50),ZIPCODE VARCHAR2(6));alter table PERSONadd constraint PK_PERSON_ID primary key (ID);
對于這種需求,我們可能有必要把其中的city,street,zipcode提取出來單獨組成一個Address類,將這個類作為Person對象的一個組成部分出現(xiàn)。
源代碼:Address.java
- package com.sun.demo;
-
- public class Address {
-
- private String city;
-
- private String street;
-
- private String zipcode;
-
- public Address() {
- }
-
- public Address(String city, String street, String zipcode) {
- this.city = city;
- this.street = street;
- this.zipcode = zipcode;
- }
-
- public String getCity() {
- return city;
- }
-
- public void setCity(String city) {
- this.city = city;
- }
-
- public String getStreet() {
- return street;
- }
-
- public void setStreet(String street) {
- this.street = street;
- }
-
- public String getZipcode() {
- return zipcode;
- }
-
- public void setZipcode(String zipcode) {
- this.zipcode = zipcode;
- }
-
- public String toString() {
- return city + " " + street + " " + zipcode;
- }
-
- }
package com.sun.demo;public class Address {private String city;private String street;private String zipcode;public Address() {}public Address(String city, String street, String zipcode) {this.city = city;this.street = street;this.zipcode = zipcode;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getStreet() {return street;}public void setStreet(String street) {this.street = street;}public String getZipcode() {return zipcode;}public void setZipcode(String zipcode) {this.zipcode = zipcode;}public String toString() {return city + " " + street + " " + zipcode;}}
對象類Person.java定義如下:注意其中將Address作為Person類的屬性出現(xiàn)。
源代碼:Person.java
- package com.sun.demo;
-
- public class Person implements java.io.Serializable {
-
- private Long id;
-
- private String name;
-
- private Address address;
-
- public Person(Long id, String name, Address address) {
- this.id = id;
- this.name = name;
- this.address = address;
- }
-
- public Address getAddress() {
- return address;
- }
-
- public void setAddress(Address address) {
- this.address = address;
- }
-
- public Person() {
- }
-
- public Person(Long id) {
- this.id = id;
- }
-
- public Long getId() {
- return this.id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getName() {
- return this.name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
- }
package com.sun.demo;public class Person implements java.io.Serializable {private Long id;private String name;private Address address;public Person(Long id, String name, Address address) {this.id = id;this.name = name;this.address = address;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}public Person() {}public Person(Long id) {this.id = id;}public Long getId() {return this.id;}public void setId(Long id) {this.id = id;}public String getName() {return this.name;}public void setName(String name) {this.name = name;}}
上面這種POJO對象的設計,對數(shù)據(jù)庫的表結(jié)構(gòu)并沒有任何影響,只是出于程序設計的考慮,增加對象設計的粒度,可以通過Address的設計作為Person對象的一個組件(Component),在映射文件中,我們可以使用<component>標簽來完成此種關系的映射。
映射關系文件Person.hbm.xml如下:
源文件:Person.hbm.xml
- <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.sun.demo.Person" table="PERSON" schema="SCOTT">
- <id name="id" type="long" column="ID">
- <generator class="assigned" />
- </id>
- <property name="name" type="string" column="NAME" />
- <component name="address" class="com.sun.demo.Address">
- <property name="city" column="city" type="string" />
- <property name="street" column="street" type="string" />
- <property name="zipcode" column="zipcode" type="string" />
- </component>
- </class>
- </hibernate-mapping>
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.sun.demo.Person" table="PERSON" schema="SCOTT"><id name="id" type="long" column="ID"><generator class="assigned" /></id><property name="name" type="string" column="NAME" /><component name="address" class="com.sun.demo.Address"><property name="city" column="city" type="string" /><property name="street" column="street" type="string" /><property name="zipcode" column="zipcode" type="string" /></component></class></hibernate-mapping>
如何使用這種組合關系,先看一下存儲對象的代碼:
- package com.sun.demo;
-
- import junit.framework.TestCase;
-
- import org.hibernate.Session;
- import org.hibernate.Transaction;
-
- public class TestPerson extends TestCase {
-
- public void testSavePerson(){
-
- Person person = new Person();
- person.setId(1001L);
- person.setName("peter");
- Address address = new Address("beijing","changan street","100080");
- person.setAddress(address);
-
- Session session = HibernateSessionFactory.getSession();
- Transaction tx = session.beginTransaction();
- session.save(person);
- tx.commit();
- HibernateSessionFactory.closeSession();
- }
-
- }