JPAの結合キー

12812 ワード

2つ以上のフィールドからなるプライマリ・キーで、結合プライマリ・キーと呼ばれます.オブジェクト向けでは、JPAでどのように定義しますか?JPA連合プライマリ・キーの定義方法オブジェクト指向の考え方で考えると,結合主鍵の中の複合主鍵(フィールド)は,それを全体として見ることができ,この複合主鍵のフィールドを一つの主鍵クラスで記述する結合主鍵クラスについては,以下の点を必ず遵守しなければならない.publicのパラメータなし構造関数を指定する必要があります.2.シーケンス化インタフェースを実装する必要がある.hashCode()とequals()の2つのメソッドを書き換える必要があります.この2つの方法は、このオブジェクトが等しいか否かを判定するArtLinePKとして複合プライマリキーのフィールドを用いるべきである.java
 
package cn.itcast.bean; 
 
import java.io.Serializable; 
 
import javax.persistence.Column; 
import javax.persistence.Embeddable; 
 
    @Embeddable 
    //      ArtLinePK          ,  JPA     :                  
    //      :ArtLinePK         ArtLine     ,  ArtLinePK      ArtLine     
    public class ArtLinePK implements Serializable{ 
    private String startCity; 
    private String endCity; 
 
    public ArtLinePK() { 
    } 
 
    public ArtLinePK(String startCity, String endCity) { 
        this.startCity = startCity; 
        this.endCity = endCity; 
    } 
 
    @Column(length=3) 
    public String getStartCity() { 
        return startCity; 
    } 
 
    public void setStartCity(String startCity) { 
        this.startCity = startCity; 
    } 
 
    @Column(length=3) 
    public String getEndCity() { 
        return endCity; 
    } 
 
    public void setEndCity(String endCity) { 
        this.endCity = endCity; 
    } 
 
    @Override 
    public int hashCode() { 
        final int prime = 31; 
        int result = 1; 
        result = prime * result + ((endCity == null) ? 0 : endCity.hashCode()); 
        result = prime * result    + ((startCity == null) ? 0 : startCity.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; 
        final ArtLinePK other = (ArtLinePK) obj; 
        if (endCity == null) { 
            if (other.endCity != null) 
                return false; 
        } else if (!endCity.equals(other.endCity)) 
            return false; 
            if (startCity == null) { 
                if (other.startCity != null) 
                    return false; 
            } else if (!startCity.equals(other.startCity)) 
                return false; 
        return true; 
    } 
 
}

package cn.itcast.bean;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Embeddable;

@Embeddable
この注釈はArtLinePKというクラスがエンティティに使われていることを表し、JPAの実装製品に、エンティティクラスではこのような定義の属性しか使われていないことを伝える.
簡単に理解すると、ArtLinePKの属性はArtLineクラスの属性と見なすことができる.例えばArtLinePKの属性はArtLineで定義されている
public class ArtLinePK implements Serializable{
private String startCity;
private String endCity;

public ArtLinePK(){

public ArtLinePK(String startCity,String endCity){
this.startCity = startCity;
this.endCity = endCity;
}

@Column(length=3)
public String getStartCity() {
return startCity;
}

public void setStartCity(String startCity) {
this.startCity = startCity;
}

@Column(length=3)
public String getEndCity() {
return endCity;
}

public void setEndCity(String endCity) {
this.endCity = endCity;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((endCity == null) ? 0 : endCity.hashCode());
result = prime * result + ((startCity == null) ? 0 : startCity.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;
final ArtLinePK other = (ArtLinePK) obj;
if (endCity == null) {
if (other.endCity != null)
return false;
} else if (!endCity.equals(other.endCity))
return false;
if (startCity == null) {
if (other.startCity != null)
return false;
} else if (!startCity.equals(other.startCity))
return false;
return true;
}

}という連合プライマリ・キー・クラスは、エンティティ・クラスのプライマリ・キー(エンティティ識別子,id)ArtLineとすべきである.java
package cn.itcast.bean; 
 
import javax.persistence.Column; 
import javax.persistence.EmbeddedId; 
import javax.persistence.Entity; 
 
@Entity 
public class ArtLine { 
    private ArtLinePK id;//             ,            ,      ArtLinePK    
    private String name; 
 
    public ArtLine() { 
    } 
 
    public ArtLine(ArtLinePK id) { 
        this.id = id; 
    } 
 
    public ArtLine(String startCity, String endCity, String name) { 
        this.id = new ArtLinePK(startCity, endCity); 
        this.name = name; 
    } 
 
    @EmbeddedId //  JPA    ,      @Id     
    //@EmbeddedId         id           ,             , 
    //      @EmbeddedId                          
    public ArtLinePK getId() { 
        return id; 
    } 
 
    public void setId(ArtLinePK id) { 
        this.id = id; 
    } 
 
    @Column(length=20) 
    public String getName() { 
        return name; 
    } 
 
    public void setName(String name) { 
        this.name = name; 
    } 
}

package cn.itcast.bean;

import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;

@Entity
public class ArtLine{
private ArtLinePKid;//オブジェクト向けの考え方で考えると、この複合プライマリ・キーは全体として見られ、複合プライマリ・キークラスArtLinePKによって記述される

public ArtLine(){
}

public ArtLine()

public ArtLine(ArtLinePKid){this.id=id;


public ArtLine(String startCity,String endCity,String name){
@EmbeddedId//@JPA仕様では、
/@EmbeddedIdという注釈はidという属性がエンティティである識別子を表記するために使用されません.複合プライマリ・キー・クラスを使用しているので、
したがって、複合プライマリ・キー・クラスに特化したエンティティ識別子を表す注記@EmbeddedId(){
returnid;

public void setId(
this.id=id;
<
return name;

public void setName(String name){
this.name=name;
}複合プライマリ・キー・クラスは、これまで定義されています.定義したら、生成されたデータベース・テーブルが複合プライマリ・キーを満たしているかどうかを確認します.ArtLineTest.java
 
package junit.test; 
 
 
import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 
 
import org.junit.BeforeClass; 
import org.junit.Test; 
 
import cn.itcast.bean.ArtLine; 
 
public class ArtLineTest { 
 
    @BeforeClass 
    public static void setUpBeforeClass() throws Exception { 
    } 
 
    @Test public void save(){ 
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast"); 
        EntityManager em = factory.createEntityManager(); 
        em.getTransaction().begin(); 
 
        em.persist(new ArtLine("PEK","SHA","     ")); 
 
        em.getTransaction().commit(); 
        em.close(); 
        factory.close(); 
    } 
}

package junit.test;


import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import org.junit.BeforeClass;
import org.junit.Test;

import cn.itcast.bean.ArtLine;

public class ArtLineTest {

@BeforeClass
public static void setUpBeforeClass() throws Exception {
}

@Test public void save(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();

em.persist(new ArtLine(「PEK」,「SHA」,「北京飛上海」);

em.getTransaction().commit();
em.close();
factory.close();
}
}