JPA에서 복합 기본 키를 만들고 처리하는 방법


108

동일한 데이터 항목의 버전을 갖고 싶습니다. 즉, 항목을 다른 버전 번호로 복제하고 싶습니다.

id - Version 기본 키가됩니다.

엔티티는 어떻게 생겼습니까? 다른 버전으로 복제하려면 어떻게해야합니까?

id Version ColumnA

1   0      Some data
1   1      Some Other data
2   0      Data 2. Entry
2   1      Data

@IdClass주석을 사용할 때 내가 찾은 또 다른 팁은 @Column주석이 Entity 클래스의 필드 ( YourEntityRohitJan의 샘플 코드에 있음) 로 이동해야한다는 것 입니다.
KenSV 2017

답변:


231

당신은 할 수 있습니다 Embedded class당신이 키를 포함하는, 다음으로 그 클래스에 대한 참조가 EmbeddedId귀하의에서 Entity.

@EmbeddedId@Embeddable주석 이 필요합니다 .

@Entity
public class YourEntity {
    @EmbeddedId
    private MyKey myKey;

    @Column(name = "ColumnA")
    private String columnA;

    /** Your getters and setters **/
}
@Embeddable
public class MyKey implements Serializable {

    @Column(name = "Id", nullable = false)
    private int id;

    @Column(name = "Version", nullable = false)
    private int version;

    /** getters and setters **/
}

이 작업을 달성하는 또 다른 방법은 사용하는 것입니다 @IdClass여러분 모두 주석과 장소를 id한다는 점에서 IdClass. 이제 @Id두 속성 모두에 일반 주석을 사용할 수 있습니다.

@Entity
@IdClass(MyKey.class)
public class YourEntity {
   @Id
   private int id;
   @Id
   private int version;

}

public class MyKey implements Serializable {
   private int id;
   private int version;
}

4
그것은 사용할 수 있습니다 @GeneratedvalueID를 EmbeddedId에 의해
카이저

1
@Kayser. 내가 아는 한. 아니요. KeyClass 인스턴스에서 해당 값을 명시 적으로 설정 한 다음 엔터티에서 해당 키 클래스 인스턴스를 설정해야합니다.
Rohit Jain

@Kayser. @GeneratedValue기본 키에 대한 키 값을 생성하는 데만 사용할 수 있으며 복합 키에 대한 조합을 생성 할 수 없습니다.
Rohit Jain

1
@RohitJain 한 가지만 : 실제로 임베디드 클래스를 공개 할 수 없습니다 (공개하려면 자체 파일에 있어야 함)
Lucas

1
@FastEngy 그것은 여전히 뒤로 기계를 통해 액세스 할 수 있습니다 web.archive.org/web/20170123035517/http://uaihebert.com/...를 . 이 문서에 의해 대체되는 것 같다 web.archive.org/web/20170202203555/http://uaihebert.com/...web.archive.org/web/20161014051056/http://uaihebert.com/... 도 사라졌다 …
radlan

9

MyKey 클래스는 Serializable다음을 사용 하는 경우 구현해야합니다.@IdClass


5

주요 클래스 :

@Embeddable
@Access (AccessType.FIELD)
public class EntryKey implements Serializable {

    public EntryKey() {
    }

    public EntryKey(final Long id, final Long version) {
        this.id = id;
        this.version = version;
    }

    public Long getId() {
        return this.id;
    }

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

    public Long getVersion() {
        return this.version;
    }

    public void setVersion(Long version) {
        this.version = version;
    }

    public boolean equals(Object other) {
        if (this == other)
            return true;
        if (!(other instanceof EntryKey))
            return false;
        EntryKey castOther = (EntryKey) other;
        return id.equals(castOther.id) && version.equals(castOther.version);
    }

    public int hashCode() {
        final int prime = 31;
        int hash = 17;
        hash = hash * prime + this.id.hashCode();
        hash = hash * prime + this.version.hashCode();
        return hash;
    }

    @Column (name = "ID")
    private Long id;
    @Column (name = "VERSION")
    private Long operatorId;
}

엔티티 클래스 :

@Entity
@Table (name = "YOUR_TABLE_NAME")
public class Entry implements Serializable {

    @EmbeddedId
    public EntryKey getKey() {
        return this.key;
    }

    public void setKey(EntryKey id) {
        this.id = id;
    }

    ...

    private EntryKey key;
    ...
}

다른 버전과 복제하려면 어떻게해야합니까?

공급자에서 검색 한 엔티티를 분리하고 Entry의 키를 변경 한 다음 새 엔티티로 유지할 수 있습니다.


Entrykey에서 ID를 정의 할 수 있습니다 AUTOGENERATED. 그런 데르 일 @GeneratedValue(strategy = GenerationType.IDENTITY)
카이저

1
2 개의 긴 기본 키에 대한 해시를 계산하는 방법도 궁금합니다. 에 관해서 hashprime방법 hashCode클래스에서 EntryKey그 아이디어가 어디에서 오는지, 당신이 나를 알 수 있습니까?
브루스 일

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.