2015-08-14 20 views
5
yerine @NaturalId

Kullanarak, bir çağrışım sınıfı oluşturmama izin veren bazı Hazırda Bekleme/JPA ek açıklamalarım var (yine de dürüst olmak için farkı bilmiyorum). Bu sınıf, bir nesneyle ilişkili iki öğeyi birleştiriyor. Orijinal olarak @JoinTable kullanıyordum, ancak dernekler ile çok daha fazla meta veriye ihtiyacım olduğunu fark ettim, bu yüzden kodu başka bir nesne türüne dönüştürmek zorunda kaldım. Hibernate @ManyToOne Başvurulan Sınıf @Id

Şimdilik benim nesneler için ID sütun işaretlemek için @Id kullanıyorum ve String uuid için @NaturalId (mutable = false) kullanarak.

İlişkilendirme kursum @ManyToOne kullanıyor ve tabloyu iyi oluşturuyor, ancak tabloya baktığımda tablo eşleme sütunu olarak @Id alanını kullanıyor. İlişkilendirme/ilişkilendirmeleri diğer sistemlere aktarma kolaylığı için bu ilişkilendirme sınıfının @NaturalId uuid kullanmasını tercih ederim.

Doğru tanıtıcıyı kullanmak için ilişkiyi nasıl edinebilirim? Başvuru için

böyle benim DB'ın ve Java kodu görünüm:

AssociationsTable 
---------------------------------------------- 
| ID | META DATA | ID ASSOC. 1 | ID ASSOC. 2 | 
---------------------------------------------- 
| 1 | stuff | 1  |  2  | 
---------------------------------------------- 

Objects 
------------------------------ 
| ID | META DATA | UUID  | 
------------------------------ 
| 1 | stuff | FOO-123 | 
------------------------------ 
| 2 | stuff | BAR-456 | 
------------------------------ 

Association Class{ 
    ObjA main; 
    ObjA sub; 

    @ManyToOne 
    getMain() 

    @ManyToOne 
    getSub() 
} 

ObjA Class{ 
    Long id; 
    @Id 
    @GeneratedValue(generator="increment") 
    @GenericGenerator(name="increment", strategy = "increment") 
    @XmlElement 
    @Column(name = "ID", unique = true, nullable = false) 
    getId() 

    String uuid;  
    @NaturalId (mutable = false) 
    @GeneratedValue(generator = "uuid") 
    @GenericGenerator(name = "uuid", strategy = "uuid2") 
    @Column(name = "uuid", unique = true) 
    getUUID() 
} 
+0

[Önceki sorunuzun] farkındayım (http://stackoverflow.com/q/31926396/835000). Bu yüzden netleştirmeye karar verdim: neden tabloları bağlama konusunda endişeleniyorsunuz? Yani veritabanı seviyesindeki varlıklar '@ 'ile bağlanabilirler, daha sonra sıfırlama anahtar değerleri ile serileştirilebilirler, sonra başka bir örneğe iletilebilirler, java-fasulye seviyesindeki tüm ilişkilerle serileştirilir, ardından yeni veritabanında yeni değerler ile temizlenirler. '@ Id' özellikleri ... Varlıklar için birincil anahtarlar farklı olacak, ancak yine de bunları @ NaturalId alanıyla alabileceksiniz. Bir şey özledim mi? .. – svaor

cevap

3

Sen @JoinColumn ait referencedColumnName özelliğini kullanabilirsiniz, here belirtildiği gibi.

ObjA.java:

package hello; 

import org.hibernate.annotations.NaturalId; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 

@Entity 
public class ObjA { 
    Long id; 
    String uuid; 

    public ObjA() { 
    } 

    public ObjA(String uuid) { 
     this.uuid = uuid; 
    } 

    @Id 
    @GeneratedValue 
    @Column(name = "obj_a_id", unique = true, nullable = false) 
    Long getId() { 
     return id; 
    } 

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

    @NaturalId(mutable = false) 
    @Column(name = "uuid", unique = true, nullable = false) 
    public String getUuid() { 
     return uuid; 
    } 

    public void setUuid(String uuid) { 
     this.uuid = uuid; 
    } 
} 

Association.java:

package hello; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 

@Entity 
public class Association { 
    Long id; 
    ObjA main; 
    ObjA sub; 

    public Association() { 
    } 

    public Association(ObjA main, ObjA sub) { 
     this.main = main; 
     this.sub = sub; 
    } 

    @Id 
    @GeneratedValue 
    @Column(name = "association_id", unique = true, nullable = false) 
    Long getId() { 
     return id; 
    } 

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

    @ManyToOne 
    @JoinColumn(name = "main_uuid", referencedColumnName = "uuid", nullable = false) 
    public ObjA getMain() { 
     return main; 
    } 

    public void setMain(ObjA main) { 
     this.main = main; 
    } 

    @ManyToOne 
    @JoinColumn(name = "sub_uuid", referencedColumnName = "uuid", nullable = false) 
    public ObjA getSub() { 
     return sub; 
    } 

    public void setSub(ObjA sub) { 
     this.sub = sub; 
    } 
} 

Bu eşleşmeler başarıyla mağaza değerlerine test edildi aşağıdaki gibi Yani örneğin, eşlemeler olmalı main_uuid ve sub_uuid tablosunun sütunundaki uuid sütunundan association tablo. Bu, PostgreSQL 9.4.4'e karşı org.hibernate.common:hibernate-commons-annotations:4.0.5.Final, org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final, org.hibernate:hibernate-core:4.3.10.Final ve org.hibernate:hibernate-entitymanager:4.3.10.Final kullanılarak test edildi.

+1

Bunu denedim, yanı sıra 'referenceTable' kullanma şansı yok. – Walls

+1

@Walls Yerel makinemde 'referenceColumnName' kullanmayı denedim ve benim için çalıştı. Cevabımı kullandığım tam eşlemelerle güncelledim. İlişkilendirmeler tablosunda UUID'leri görmüyorsanız, doğru veritabanına işaret ettiğinizden ve ayrıca bunu yeniden oluşturduğunuzdan emin olun. – heenenee