022 component(組件)關聯映射

Component關聯映射:

目前有兩個類以下:數據庫

值對象沒有標識,而實體對象具備標識,值對象屬於某一個實體,使用它重複使用率提高,並且更清析。session

 

以上關係的映射稱爲component(組件)關聯映射app

在hibernate中,component是某個實體的邏輯組成部分,它與實體的根本區別是沒有oid,component能夠成爲是值對象(DDD)。this

採用component映射的好處:它實現了對象模型的細粒度劃分,層次會更加分明,複用率會更高。spa

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類是值對象,不是實體對象,是屬於實體類的某一部分,所以沒有映射文件hibernate

導出數據庫輸出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))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

相關文章
相關標籤/搜索