source

JPA에서 복합 프라이머리 키를 만들고 처리하는 방법

gigabyte 2022. 9. 25. 21:23
반응형

JPA에서 복합 프라이머리 키를 만들고 처리하는 방법

같은 데이터 엔트리의 버전을 원합니다.즉, 다른 버전 번호로 엔트리를 복제하고 싶습니다.

id - Version이 프라이머리 키가 됩니다.

엔티티는 어떻게 보여야 합니까?다른 버전으로 복제하려면 어떻게 해야 하나요?

id Version ColumnA

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

만들 수 있습니다.Embedded class2개의 키가 저장되어 그 클래스가 참조됩니다.EmbeddedId당신의 안에서Entity.

및 주석이 필요합니다.

@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;
}

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

키 클래스:

@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 키를 변경한 다음 새 엔티티로 유지할 수 있습니다.

MyKey 클래스(@Embeddable)는 @ManyToOne과 같은 관계를 가질 수 없습니다.

언급URL : https://stackoverflow.com/questions/13032948/how-to-create-and-handle-composite-primary-key-in-jpa

반응형