2008-10-28 29 views
16

Birleşik JPA veya JPA + Hazırda bekletme uzantılarında bileşik anahtarın bir bileşen olduğu bir bileşik anahtar bildirmesi mümkün mü?JPA Bileşik Anahtar + Sıra

Bu benim kompozit sınıftır:

@Embeddable 
public class IntegrationEJBPk implements Serializable { 

    //... 


    @ManyToOne(cascade = {}, fetch = FetchType.EAGER) 
    @JoinColumn(name = "APPLICATION") 
    public ApplicationEJB getApplication() { 
     return application; 
    } 


    @Column(name = "ENTITY", unique = false, nullable = false, insertable = true, updatable = true) 
    public String getEntity() { 
     return entity; 
    } 

    @GeneratedValue(strategy = GenerationType.AUTO, generator = "INTEGRATION_ID_GEN") 
    @SequenceGenerator(name = "INTEGRATION_ID_GEN", sequenceName = "OMP_INTEGRATION_CANONICAL_SEQ") 
    @Column(name = "CANONICAL_ID", unique = false, nullable = false, insertable = true, updatable = true) 
    public String getCanonicalId() { 
     return canonicalId; 
    } 

    @Column(name = "NATIVE_ID", unique = false, nullable = false, insertable = true, updatable = true) 
    public String getNativeId() { 
     return nativeId; 
    } 

    @Column(name = "NATIVE_KEY", unique = false, nullable = false, insertable = true, updatable = true) 
    public String getNativeKey() { 
     return nativeKey; 
    } 

    //... 
} 

Zaten application, entity, nativeId ve nativeKey değerlerini sağlamak. Ben aşağıdaki gibi bir varlık inşa etmek istiyorum:

IntegrationEJB i1 = new IntegrationEJB(); 
i1.setIntegrationId(new IntegrationEJBPk()); 
i1.getIntegrationId().setApplication(app1); 
i1.getIntegrationId().setEntity("Entity"); 
i1.getIntegrationId().setNativeId("Nid"); 
i1.getIntegrationId().setNativeKey("NK"); 

Ve) em.persist(i1 çağırdığınızda, ben canonicalId oluşturulur ve entegrasyon takıldığını istiyorum.

Bu mümkün mü? Eğer öyleyse, basit yol nedir? (Uygulama tarafından sağlanan anahtarları veya yerel sql kullanmayı tercih etmiyorum). Böyle

cevap

3

Bunun basit JPA ile mümkün olmadığını düşünüyorum.

+0

Bu mümkündür. Bulduğum tek yol, Kimlik bölümlerinin takılabilir veya güncellenemez olmasını gerektiriyor. Güncel olmayan yayını açıklığa kavuşturmak istedim, çünkü bu, arama sonuçlarında en üst sırada yer aldı. – Valchris

+0

Bileşen birincil anahtarlar için @ @ GeneratedValue 'açıklaması [desteklenmez] (http://www.objectdb.com/api/java/jpa/GeneratedValue). –

+2

Merhaba, şu anda destekleniyor görünüyor: https://hibernate.onjira.com/browse/HHH-4552 – Eugen

1

Dene: yerine bir tablo kullanabileceğiniz bir diziyi kullanarak bu yolla

@TableGenerator(name = "canonicalKeys", allocationSize = 1, initialValue = 1) 
@GeneratedValue(strategy = GenerationType.TABLE, generator = "canonicalKeys") 
@Column(name = "CANONICAL_ID", unique = false, nullable = false, insertable = true, updatable = true) 
public String getCanonicalId() { 
    return canonicalId; 
} 

.

+0

Veritabanı modelimi değiştiremediğim için bir sıra kullanmalıyım. –

1

Yapılarınızın bu example gibi birleşik bir birincil anahtar oluşturduğunu fark ettim. select nextval ('hibernate_sequence')

ben ;-)

2

@GeneratedValue kullanma gerçi bu hile olurdu herhalde: Kendi veritabanında benzer bir sorun de alay ederken belki sql doğrudan gibi diyebiliriz merak ettim kompozit PK'lar için JPA 2 spesifikasyonu belirtilmemiş. JPA spec itibaren

: GeneratedValue açıklama birincil anahtarların değerleri için nesil stratejilerin şartname sağlar

11.1.17 GeneratedValue Ek Açıklama. GeneratedValue ek açıklaması, bir anahtarın birincil anahtar özelliğine veya alanına veya Id ek notu ile birlikte eşleştirilmiş bir süper sınıfı için uygulanabilir. [97] GeneratedValue ek açıklamasının kullanımı, basit birincil anahtarlar için desteklenmesi gereken yalnızca 'dur. Türetilmiş birincil anahtarlar için GeneratedValue ek açıklığının kullanılması desteklenmez. Farklı senaryo altında, sen @GeneratedValue kullanan basit bir PK (@id) ile bir üst varlık var ve o andan itibaren oluşturulan kimliği içeren bir kompozit PK olan bir çocuk varlık olabileceğini

Not ebeveyn, artı başka bir sütun. Bir FK sütununda oluşturulan kimliği devralır, böylece

  • , çocuğa ana öğeye bir @ManyToOne ilişkisi verin.
  • Sonra işletmeye karşı belirtilen @IdClass yoluyla, çocuğun bir kompozit PK vermek, artı varlık içinde iki @id sütunlar.
@Entity 
public class ParentEntity { 
 @Id 
     @GenerateValue(IDENTITY) // If using DB auto-increment or similar 
     int id; 

     // ... 
} 
@Entity 
@IdClass(ChildId.class) 
public class ChildEntity { 
    // The child table will have a composite PK: 
    // (parent_ID, child_name) 
     @Id 
     @ManyToOne 
     int parentEntity; 
 @Id 
     String childName; 

     String favoriteColor; // plus other columns 

     // ... 

} 
// child Id attributes have the same name as the child entity 
// however the types change to match the underlying PK attributes 
// (change ParentEntity to int) 
public class ChildId implements Serializable { 
 int parentEntity; 
     String childName; 

     public ChildId() { //... } 

     // Add extra constructor & remove setter methods so Id objects are immutable 
     public ChildId(int parentEntity, String childName) { //... } 


     public int getParentEntity() { //... } 
     // make Id objects immutable: 
     // public void setParentEntity(int parentEntity) { //... } 
     public String getChildName() { //... } 
     // public void setChildName(String childName) { //... } 
} 
İlgili konular