JPA: @JoinColumn ve @PrimaryKeyJoinColumn arasındaki fark?


83

Arasındaki kesin fark nedir @JoinColumnve @PrimaryKeyJoinColumn?

@JoinColumnYabancı anahtarın parçası olan sütunlar için kullanırsınız . Tipik bir sütun şöyle görünebilir (örneğin, ek özelliklere sahip bir birleştirme tablosunda):

@ManyToOne
@JoinColumn(name = "...")
private OtherClass oc;

Sütunu da a / PK (diğer bir deyişle tanımlayıcı ilişki) olarak yükseltirsem ne olur? Sütun artık PK olduğu için, onu şu şekilde etiketlemeliyim @Id:

@Id
@ManyToOne
@JoinColumn(name = "...")
private OtherClass oc;

Şimdi soru şu:

Are @Id+ @JoinColumntıpkı aynı @PrimaryKeyJoinColumn:

@ManyToOne
@PrimaryKeyJoinColumn(name = "...")
private OtherClass oc;

Değilse, ne @PrimaryKeyJoinColumniçin var?

Yanıtlar:


55

Sütunu da a / PK (diğer bir deyişle tanımlayıcı ilişki) olarak yükseltirsem ne olur? Sütun artık PK olduğundan, onu @Id (...) ile etiketlemeliyim.

Türetilmiş tanımlayıcıların bu gelişmiş desteği , aslında JPA 2.0'daki yeni öğelerin bir parçasıdır ( JPA 2.0 spesifikasyonundaki Türetilmiş Kimliklere Karşılık Gelen 2.4.1 Birincil Anahtarlar bölümüne bakın ), JPA 1.0, Idbir OneToOneveya ManyToOne. JPA 1.0 ile, yabancı anahtar sütunu için PrimaryKeyJoinColumnbir Basic Ideşleme kullanmanız ve tanımlamanız gerekir .

Şimdi soru şu: @Id + @JoinColumn @PrimaryKeyJoinColumn ile aynı mı?

Sen benzer bir sonuç elde etmek ancak bir kullanarak yapabilirsiniz Idüstünde OneToOneya ManyToOneolduğu daha basit ve JPA 2.0 ile türetilmiş tanımlayıcıları eşlemek için tercih edilen yoldur. PrimaryKeyJoinColumnhala bir KATILMIŞ miras stratejisinde kullanılabilir. JPA 2.0 spesifikasyonundan ilgili bölümün altında:

11.1.40 PrimaryKeyJoinColumn Ek Açıklaması

PrimaryKeyJoinColumnAçıklama, başka bir tabloya katılması için yabancı bir anahtar olarak kullanılan bir ana anahtar sütunu belirtir.

PrimaryKeyJoinColumnAçıklama bir işletme alt sınıfının birincil tablo birleştirmek için kullanılan JOINED onun süper birincil tablo eşleme stratejisi; SecondaryTableikincil bir tabloyu birincil tabloyla birleştirmek için bir açıklama içinde kullanılır ; ve OneToOne referans veren varlığın birincil anahtarının referans alınan varlığa [108] yabancı anahtar olarak kullanıldığı bir eşlemede kullanılabilir .

...

Hayır ise PrimaryKeyJoinColumn ek açıklama KATILDI haritalama stratejisinde bir alt sınıf için belirtilen yabancı anahtar sütunları üst sınıfın birincil tablonun birincil anahtar sütunları aynı isimlere sahip olduğu varsayılır.

...

Örnek: Customer ve ValuedCustomer alt sınıfı

@Entity
@Table(name="CUST")
@Inheritance(strategy=JOINED)
@DiscriminatorValue("CUST")
public class Customer { ... }

@Entity
@Table(name="VCUST")
@DiscriminatorValue("VCUST")
@PrimaryKeyJoinColumn(name="CUST_ID")
public class ValuedCustomer extends Customer { ... }

[108] Bölüm PrimaryKeyJoinColumn2.4.1.1'de açıklanan türetilmiş kimlik mekanizmaları artık OneToOne eşleme durumu için tercih edilecektir .

Ayrıca bakınız


Bu kaynak http://weblogs.java.net/blog/felipegaucho/archive/2009/10/24/jpa-join-table-additional-state @ManyToOne ve @Id kullanımının JPA 1.x ile çalıştığını belirtir. Şimdi kim haklı?

Yazar, JPA 1.0 (!) Hakkında bir makale yazmak için EclipseLink'in ön yayın JPA 2.0 uyumlu bir sürümünü ( makale sırasında sürüm 2.0.0-M7 ) kullanıyor. Bu makale yanıltıcıdır, yazar JPA 1.0'ın parçası OLMAYAN bir şey kullanıyor .

Kayıt için, destek Idüzerinde OneToOneve ManyToOneEclipseLink 1.1'de eklenmiştir (bkz bu mesajı gelen James Sutherland , EclipseLink comitter ve ana katkıyı Java Persistence wiki kitabı). Ama ısrar edeyim, bu JPA 1.0'ın bir parçası DEĞİL .


Bu kaynak weblogs.java.net/blog/felipegaucho/archive/2009/10/24/… @ManyToOne ve @Id kullanımının JPA 1.x ile çalıştığını belirtir. Şimdi kim haklı?
Kawu

TAMAM. Bunu açıklığa kavuşturduğunuz için teşekkürler. Atılan kötü örneğin @IdClass'ı yanlış kullandığı konusunda haklıyım? @Id ek açıklamalarının doğru olması için varlık sınıfındaki ayrı (yedek / yinelenen) sütunlara yerleştirilmesi gerekmez mi? (Ben @IdClass artık tavsiye edilmez kullanarak biliyoruz gerçi ven)
Kawu

Demek istediğim, sınıfta iki özellik olmalıdır: @Id @Column özel String kurumu; ve @Id @Column özel String yarışması; sadece PK'yi doğru belirtmek için?
Kawu

@Kawu Üzgünüm ama dürüst olmak gerekirse, bunu küçük bir yorum kutusunda tartışmak çok zor. Neden bahsettiğini anladığımdan bile emin değilim. Başka bir özel sorunuz varsa, ya bir JPA uygulaması seçmenizi ve biraz denemenizi ya da tam bir örnekle (ve JPA sürümünü) yeni bir soru göndermenizi öneririm . Bu, işleri çok daha kolaylaştırır.
Pascal Thivent

38

Normalde bu ikisini şu diyagramla ayırt ederim:

Kullanım PrimaryKeyJoinColumn

görüntü açıklamasını buraya girin

Kullanım JoinColumn

görüntü açıklamasını buraya girin


3
@yusher, PrimaryKeyJoinColumniki tabloyu birleştirmek için aynı birincil anahtar değerini kullanın ve JoinColumnana tablonun birincil anahtarı başka bir tablodaki yabancı anahtar haline gelecektir.
Sam YC

2

Bunun eski bir gönderi olduğunu biliyorum, ancak PrimaryKeyColumntek yönlü bir ilişki istiyorsanız veya hepsi aynı kimliği paylaşan birden fazla tablonuz varsa kullanmak için iyi bir zaman olurdu.

Genel olarak bu kötü bir fikirdir ve yabancı anahtar ilişkilerini kullanmak daha iyi olacaktır JoinColumn.

Bunu söyledikten sonra, böyle bir sistemi kullanan eski bir veritabanı üzerinde çalışıyorsanız, o zaman onu kullanmak için iyi bir zaman olacaktır.

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.