January 16, 2014

ORM : Embeddable

ပြီးခဲ့သော Composite Key များခေါင်းစဉ်ဖြင့် Embeddable Class များအကြောင်းကို တစ်စိတ်တစ်ပိုင်း ဖော်ပြခဲ့ဘူးပါသည်။ ထိုစဉ်က Embeddable Entity များအား Composite ID အနေနှင့် အသုံးပြုနိုင်ကြောင်း ဖော်ပြခဲ့၏။ ယခုတစ်ခေါက်တွင် သာမန် Attribute အနေနှင့် Embeddable Entity များအား အသုံးပြုနိုင်ကြောင်း ဖော်ပြသွားပါမည်။

Embeddable Class များအား ရိုးရိုး Class တစ်ခုတည်းအနေနှင့်သော်၎င်း၊ Collection အနေနှင့်သော်၎င်း အသုံးပြုနိုင်ပါသည်။


Embedded a single Embeddable Class


Embeddable Class တစ်ခုအား အခြားသော Entity Class တစ်ခုအတွင်းတွင် အသုံးပြုလိုပါက @Embeddable နှင့် @Embedded Annotation အားအသုံးပြုရန် လိုအပ်ပါသည်။ Composite ID တွင်အသုံးပြုသကဲ့သို့ပင် Embedded လုပ်လိုသည့် Class အား POJO အနေနဲ့ ရေးသားပြီး @Embeddable အား ရေးသားထားရန် လိုအပ်ပြီး အောက်ပါ စီးမျဉ်းများအား လိုက်နာ၍ ရေးသားရန် လိုအပ်ပါသည်။

  • Top Level Class တစ်ခု ဖြစ်ရန်လိုအပ်ပါသည်။
  • Serializable Interface အား Implements လုပ်ထားရန်လိုအပ်ပါသည်။
  • Argument မပါသော Constructor တစ်ခု လိုအပ်ပါသည်။
  • hashCode နှင့် equals တို့အား Override လုပ်ထားရန် လိုအပ်ပါသည်။

တဖန် Embeddable Class အား ထည့်သွင်း အသုံးပြုမည့် Entity Class အတွင်းတွင် အသုံးပြုမည့် Member ၏ ရှေ့၌ @Embedded ဟု ရေးသားထားရန် လိုအပ်၏။ ဤသို့ရေးသားထားခြင်း အားဖြင့် Embeddable Class  အတွင်းရှိ Member များသည် Entity Class နှင့် Map လုပ်မည့် Table အတွင်း Column များအနေနှင့် Map လုပ်သွားနိုင်မည် ဖြစ်ပါသည်။


နမှုနာအနေနှင့် Address Embeddable Class တစ်ခုအား ရေးသား၍ ၎င်းအား Student Table အတွင်းတွင် Embedded လုပ်၍ ရေးသားကြည့်ပါမည်။ ဦးစွာ Embeddable အဖြစ် အသုံးပြုမည့် Address Class အား အောက်ပါအတိုင်း ရေးသားပါမည်။
package com.mmju.jpa.embeddable.entity;

import java.io.Serializable;

import javax.persistence.Embeddable;

@Embeddable
public class Address implements Serializable {

    private static final long serialVersionUID = 8773839894821736780L;
    
    private String address;
    private String township;
    private String state;
    
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String getTownship() {
        return township;
    }
    public void setTownship(String township) {
        this.township = township;
    }
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((address == null) ? 0 : address.hashCode());
        result = prime * result + ((state == null) ? 0 : state.hashCode());
        result = prime * result
                + ((township == null) ? 0 : township.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Address other = (Address) obj;
        if (address == null) {
            if (other.address != null)
                return false;
        } else if (!address.equals(other.address))
            return false;
        if (state == null) {
            if (other.state != null)
                return false;
        } else if (!state.equals(other.state))
            return false;
        if (township == null) {
            if (other.township != null)
                return false;
        } else if (!township.equals(other.township))
            return false;
        return true;
    }
}

အထက်ဖော်ပြပါအတိုင်း Address Class အား @Embeddable Annotation အား တပ်ကာ Serilizable Interface အား Implement လုပ်၍ ရေးသားပါသည်။ hashCode နှင့် equals method များအား Eclipse ၏ Source Generation Function အား အသုံးပြု၍ ရေးသားပါသည်။ ဤသို့ ရေးသားထားရုံနှင့် Embedded အဖြစ် အသုံးပြုနိုင်မည် ဖြစ်သည်။

ပြီးပါက ၎င်းအား အသုံးပြုမည့် Student Entity Class အား အောက်ပါအတိုင်း ရေးသားပါသည်။
package com.mmju.jpa.embeddable.entity;

import java.io.Serializable;

import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Student implements Serializable {

    @Id
    @GeneratedValue
    private long id;
    private String name;
    
    @Embedded
    private Address address;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    private static final long serialVersionUID = 1L;

}

အထက်ပါအတိုင်း Embedded လုပ်လိုသည့် Address ၏ အရှေ့တွင် @Embedded ဟု ရေးသား၍ အသုံးပြုပါသည်။ ၎င်းအား Test Class မှ ခေါ်ယူ အသုံးပြုကြည့်သောအခါ Database အတွင်းတွင် အောက်ပါအတိုင်း Table အား သွားဆောင့်ပေးနိုင်သည်ကို တွေ့ရပါသည်။


Address Class အတွင်းမှ Member များအားလုံး student table အတွင်း Column အနေနှင့် Mapping လုပ်ပေးနိုင်သည်ကို တွေ့ရပါသည်။


Embedded a collection of Embeddable Class


အထက်ဖော်ပြပါကဲ့သို့ Embeddable Class များအား Entity များအတွင်း တစ်ခုချင်းအသုံးပြုနိုင်သလို Collection အနေနဲ့လည်း အသုံးပြုနိုင်ပါသည်။ အသုံးပြုနိုင်သည့် Collection များမှာ List, Set နှင့် Map တို့ ဖြစ်ကြသည်။ ယခင်တစ်ခေါက်ဖြင့် List ရော Map ပါ ဖော်ပြခဲ့ပါသဖြင့် ယခု နမှုနာတွင် Map ကိုသာ  အသုံးပြု၍ ဖော်ပြသွားပါမည်။

Embeddable Class အား Map ၏ Value အနေနှင့် အသုံးပြုလိုသည့်အခါ @Embeddable, @ElementCollection, @CollectionTable နှင့် @MapKeyColumn Annottion တို့အား အသုံးပြုရန် လိုအပ်ပါသည်။

နမှုနာအနေနှင့် Address Class အား Embeddable အနေနှင့် အသုံးပြုပြီး Customer Entity အတွင်းတွင် Embedded Map အနေနှင့် အသုံးပြုကြည့်ပါမည်။
package com.mmju.jpa.embeddable.entity;

import java.io.Serializable;
import java.util.Map;

import javax.persistence.CollectionTable;
import javax.persistence.ElementCollection;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MapKeyColumn;

@Entity
public class Customer implements Serializable{
    
    @Id
    @GeneratedValue
    private long id;
    private String name;
    
    @Embedded
    @ElementCollection
    @CollectionTable
    @MapKeyColumn(name="TYPE")
    private Map<String, Address> address;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public Map<String, Address> getAddress() {
        return address;
    }

    public void setAddress(Map<String, Address> address) {
        this.address = address;
    }
    private static final long serialVersionUID = -9054337878171843118L;
}

အထက်ပါ ပရိုဂရမ်အား Test Class မှခေါ်၍ အသုံးပြုကြည့်သောအခါ အောက်ပါအတိုင်း Table များအား တည်ဆောက်ပေးနိုင်သည်ကို တွေ့ရပါသည်။


customer Table နှင့် customer_address Table တို့အား Customer_ID Foreign Key အားအသုံးပြုကာ 1 to Many အဖြစ် Join လုပ်ပေးနိုင်သည်ကို တွေ့ရပါသည်။

ဤနည်းအားဖြင့် ရှိပြီးသား Embeddable Class များအား Entity များအကြားတွင် ပြန်လည်အသုံးချရာတွင် အသုံးပြုနိုင်ပါသည်။

ဆက်ပါဦးမည်။ လေးစားစွာဖြင့်။
မင်းလွင်

No comments:

Post a Comment