หน้าเว็บ

วันอังคารที่ 22 มกราคม พ.ศ. 2556

การสร้าง Composite Key JPA (Object Relational Mapping)

reference key http://na5cent.blogspot.com/2011/12/keys-database.html

1. สร้าง embeded table ที่จะใช้เป็น composite key
        hash code กับ equal ให้ใช้ attribute ทั้งหมด (3 ตัว)
package com.blogspot.na5cent.model;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Embeddable;

/**
 *
 * @author Redcrow
 */
@Embeddable //บอกว่าเป็น embeded 
public class DocumentSequencePK implements Serializable {

    @Column(name = "SEQUENCE_NUMBER_MAJOR", nullable = false)
    private Long sequenceNumberMajor;
    @Column(name = "SEQUENCE_NUMBER_MINOR", nullable = false)
    private Integer sequenceNumberMinor;
    @Column(name = "FISCAL_YEAR", nullable = false)
    private Integer fiscalYear;

    public DocumentSequencePK() {
    }

    public DocumentSequencePK(Long sequenceNumberMajor, Integer sequenceNumberMinor, Integer fiscalYear) {
        this.sequenceNumberMajor = sequenceNumberMajor;
        this.sequenceNumberMinor = sequenceNumberMinor;
        this.fiscalYear = fiscalYear;
    }

    public Long getSequenceNumberMajor() {
        return sequenceNumberMajor;
    }

    public Integer getSequenceNumberMinor() {
        return sequenceNumberMinor;
    }

    public Integer getFiscalYear() {
        return fiscalYear;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 41 * hash + (this.sequenceNumberMajor != null ? this.sequenceNumberMajor.hashCode() : 0);
        hash = 41 * hash + (this.sequenceNumberMinor != null ? this.sequenceNumberMinor.hashCode() : 0);
        hash = 41 * hash + (this.fiscalYear != null ? this.fiscalYear.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final DocumentSequencePK other = (DocumentSequencePK) obj;
        if (this.sequenceNumberMajor != other.sequenceNumberMajor && (this.sequenceNumberMajor == null || !this.sequenceNumberMajor.equals(other.sequenceNumberMajor))) {
            return false;
        }
        if (this.sequenceNumberMinor != other.sequenceNumberMinor && (this.sequenceNumberMinor == null || !this.sequenceNumberMinor.equals(other.sequenceNumberMinor))) {
            return false;
        }
        if (this.fiscalYear != other.fiscalYear && (this.fiscalYear == null || !this.fiscalYear.equals(other.fiscalYear))) {
            return false;
        }
        return true;
    }
}

2. ที่ Entity Class
        attribute id ให้ใช้ annotation @EmbeddedId  ส่วน data type ให้ใช้ class ที่เป็น embeded table หรือ composite key ที่เราเขียนขึ้นในข้อ 1
        hash code กับ equal ที่ attribute id ครับ
package com.blogspot.na5cent.model;

import java.io.Serializable;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;

/**
 *
 * @author Recrow
 */
@Entity
@Table(name = "DOCUMENT_SEQUENCE")
public class DocumentSequence implements Serializable {

    @EmbeddedId
    private DocumentSequencePK id; //*****************

    public DocumentSequence() {
    }

    public DocumentSequence(DocumentSequencePK id) {
        this.id = id;
    }

    public DocumentSequencePK getId() {
        return id;
    }

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

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 97 * hash + (this.id != null ? this.id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final DocumentSequence other = (DocumentSequence) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }
}

ตัวอย่างการใช้งาน
        เวลาที่เราจะ set id  เราก็ต้องสร้าง  object ของ class DocumentSequencePK ก่อน  จากนั้นก็เซตค่าต่างๆลงไป  แล้วก็ค่อยส่ง object นั้นเข้า constructor ของ entity class DocumentSequence  แค่นั้นเองครับ
         
...
...
DocumentSequencePK primaryKey = new DocumentSequencePK(registrationOutRunningNumber, 0, DateUtils.getFiscalYear(new Date()));
DocumentSequence sequence = new DocumentSequence(pk);
...
...
        แค่นี้ เราก็จะได้ composite key มาใช้งานแล้วครับ
        เวลามันเอาไปสร้างเป็น table  มันก็จะเป็น  table ธรรมดาๆ  เหมือนที่เราสร้างโดยใช้ SQL นั่นเอง
วันนี้เอาง่ายๆ  ไปนอนล่ะ  ฝันดีผีนอนเป็นเพื่อนครับ  ^___^

ไม่มีความคิดเห็น:

แสดงความคิดเห็น