目前有兩個類以下:數據庫
值對象沒有標識,而實體對象具備標識,值對象屬於某一個實體,使用它重複使用率提高,並且更清析。session
以上關係的映射稱爲component(組件)關聯映射app
在hibernate中,component是某個實體的邏輯組成部分,它與實體的根本區別是沒有oid,component能夠成爲是值對象(DDD)。this
採用component映射的好處:它實現了對象模型的細粒度劃分,層次會更加分明,複用率會更高。spa
public class User { private int id; private String name; private Contact contact;//值對象的引用 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Contact getContact() { return contact; } public void setContact(Contact contact) { this.contact = contact; } }
public class Contact { private String email; private String address; private String zipCode; private String contactTel; public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getZipCode() { return zipCode; } public void setZipCode(String zipCode) { this.zipCode = zipCode; } public String getContactTel() { return contactTel; } public void setContactTel(String contactTel) { this.contactTel = contactTel; } }
<hibernate-mapping> <class name="com.wjt276.hibernate.User" table="t_user"> <id name="id" column="id"> <generator class="native"/> </id> <property name="name" column="name"/> <!-- <component>標籤用於映射Component(組件)關係 其內部屬性正常映射。 --> <component name="contact"> <property name="email"/> <property name="address"/> <property name="zipCode"/> <property name="contactTel"/> </component> </class> </hibernate-mapping>
Contact類是值對象,不是實體對象,是屬於實體類的某一部分,所以沒有映射文件hibernate
create table t_user (id integer not null auto_increment, name varchar(255), email varchar(255), address varchar(255), zipCode varchar(255), contactTel varchar(255), primary key (id))code |
注:雖然實體類沒有基本聯繫信息,只是有一個引用,但在映射數據庫時所有都映射進來了。之後值對象能夠重複使用,只要在相應的實體類中加入一個引用便可。component
session = HibernateUtils.getSession(); tx = session.beginTransaction(); User user = new User(); user.setName("10"); Contact contact = new Contact(); contact.setEmail("wjt276"); contact.setAddress("aksdfj"); contact.setZipCode("230051"); contact.setContactTel("3464661"); user.setContact(contact); session.save(user); tx.commit();
實體類中引用值對象時,不用先保存值對象,由於它不是實體類,它只是一個附屬類,而session.save()中保存的對象是實體類。對象
就是普通的Java類加上一個映射文件,二者構成一個實體類,才能夠被session保存、更新等操做。blog