Component关联映射:
目前有两个类如下:
值对象没有标识,而实体对象具有标识,值对象属于某一个实体,使用它重复使用率提升,而且更清析。
以上关系的映射称为component(组件)关联映射
在hibernate中,component是某个实体的逻辑组成部分,它与实体的根本区别是没有oid,component可以成为是值对象(DDD)。
采用component映射的好处:它实现了对象模型的细粒度划分,层次会更加分明,复用率会更高。
User实体类:
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; } }
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; } }
User映射文件(组件映射):
<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类是值对象,不是实体对象,是属于实体类的某一部分,因此没有映射文件
导出数据库输出SQL语句:
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)) |
数据表结构:
注:虽然实体类没有基本联系信息,只是有一个引用,但在映射数据库时全部都映射进来了。以后值对象可以重复使用,只要在相应的实体类中加入一个引用即可。
组件映射数据保存:
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保存、更新等操作。