zl程序教程

您现在的位置是:首页 >  工具

当前栏目

022 component(组件)关联映射

组件映射 关联 Component 022
2023-09-11 14:13:56 时间

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保存、更新等操作。