JPA'da bileşik birincil anahtar nasıl oluşturulur ve kullanılır?


108

Aynı veri girişinden sürümlere sahip olmak istiyorum. Başka bir deyişle, girişi başka bir sürüm numarasıyla çoğaltmak istiyorum.

id - Version birincil anahtar olacaktır.

Varlık nasıl görünmeli? Başka bir sürümle nasıl çoğaltabilirim?

id Version ColumnA

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

@IdClassEk açıklamayı kullanırken, bulduğum başka bir ipucu, @Columnek açıklamanın Varlık sınıfının alanlarına ( YourEntityRohitJan'ın örnek kodunda) gitmesi gerektiğidir.
KenSV

Yanıtlar:


231

Bir yapabilir Embedded classsenin iki anahtar içeren, ve sonra olarak bu sınıfın bir başvuru olması EmbeddedIdGözlerinde farklı Entity.

@EmbeddedIdVe @Embeddableek açıklamalarına ihtiyacınız olacak .

@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 **/
}

Bu görevi başarmak için başka bir yol kullanmaktır @IdClasssizin hem ek açıklama ve yer idki IdClass. Artık @Idher iki öznitelik için de normal açıklama kullanabilirsiniz

@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
@Generatedvalue
Kimlikler için

1
@Kayser. Bildiğim kadarıyla. Hayır. KeyClass örneğinizde onlar için değeri açıkça belirlemeniz ve ardından Varlığınızda bu anahtar sınıfı örneğini ayarlamanız gerekir.
Rohit Jain

@Kayser. @GeneratedValueyalnızca bir birincil anahtar için anahtar değerleri oluşturmak için kullanılabilir, bileşik anahtarlar için kombinasyon oluşturamaz.
Rohit Jain

1
@RohitJain sadece bir şey: gömülü sınıfı herkese açık hale getiremezsiniz (herkese açık olması için kendi dosyasında olması gerekir)
Lucas



5

Anahtar sınıf:

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

Varlık sınıfı:

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

Başka bir Sürümle nasıl çoğaltabilirim?

Sağlayıcıdan alınan varlığı ayırabilir, Entry anahtarını değiştirebilir ve ardından yeni bir varlık olarak kalıcı hale getirebilirsiniz.


Entrykey'de kimliği tanımlamak mümkün AUTOGENERATED. oder bunun gibi bir şey @GeneratedValue(strategy = GenerationType.IDENTITY)
Kayser

1
Ayrıca 2 uzun birincil anahtar için hash'ı nasıl hesaplayacağımı merak ediyorum. Gelince hashve primeyöntemde hashCodesınıfta EntryKeyfikri nereden geldiğini, bana söyleyebilir?
Bruce Sun

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.