2015-10-19 19 views
11

Aşağıdaki haritalamada neyin yanlış olduğunu anlamaya çalışıyorum. Aşağıdaki eşlemenin ORM için ideal olmadığını anlıyorum, ancak veritabanı böyle ve yapısını değiştiremiyorum. JPA 2.1 ve Hibernate 5.0.2.Final kullanıyorum.Birleşik Anahtarda JoinColumns kullanıldığında yanlış TypeDescriptor

@MappedSuperclass  
public abstract class BaseEntity<T extends Serializable> implements Serializable { 

    protected T id; 

    @Id 
    public T getId() { 
     return id; 
    } 

    protected void setId(T id) { 
     this.id = id; 
    } 
} 

@Table(name = "campaign") 
@AttributeOverride(name = "id", column = @Column(name = "campaign_id")) 
public class Campaign extends BaseEntity<String> { 
    // attributes, getters and setters 
} 

@Embeddable 
public class CampaignBroadcastPK implements Serializable { 

    @ManyToOne 
    @JoinColumn(name = "campaign_id", insertable = false, updatable = false) 
    private Campaign campaign; 

    @Column(name = "broadcast_date") 
    private LocalDate broadcastDate; 

    // getters and setters 
} 

@Entity 
@Table(name = "campaign_broadcast") 
public class CampaignBroadcast implements Serializable { 

    @EmbeddedId 
    private CampaignBroadcastPK id; 

    // attributes, getters and setters 
} 

@Embeddable 
public class CampaignBroadcastProcessPK implements Serializable { 

    @ManyToOne 
    @JoinColumns({ 
     @JoinColumn(name = "campaign_id", insertable = false, updatable = false), 
     @JoinColumn(name = "broadcast_date", insertable = false, updatable = false) 
    }) 
    private CampaignBroadcast broadcast; 

    @Column(name = "process_date) 
    private LocalDate processDate; 

    // getters and setters 
} 

@Entity 
@Table(name = "campaign_broadcast_process") 
public class CampaignBroadcastProcess implements Serializable { 

    @EmbeddedId 
    private CampaignBroadcastProcessPK id; 

    // attributes, getters and setters 
} 

bu yapının Ayrıca, ben de autoApply=true ile açıklamalı java.sql.Date e LOCALDATE işlemek için bir dönüştürücü var. valueOf geçirilen dize geçerli bir tarih dize olmadığından

Ben, bir IllegalStateException atmak için java.sql.Date neden bir dize olarak eşlenmiş halde, entityManager.find() aracılığıyla CampaignBroadcastProcess yük Tarihi campaign_id dönüştürmek için çalışır hazırda bekletme çalıştığınızda.

Şüpheli Hazırda bekletme, her ikisi de bir LocalDate öğesiyle işleyerek, CampaignBroadcastProcessPK'da JoinColumns türlerini karıştırıyor.

Bu sorunla karşılaştı mı?

cevap

1

ait misordered örtülü eşleştirme olabilir, ama ikisi @JoinColum sırasını değiştirerek sorunu çözüldü olabilir. haritalama şimdi aşağıdaki gibidir:

@ManyToOne 
@JoinColumns({ 
    @JoinColumn(name = "broadcast_date", insertable = false, updatable = false), 
    @JoinColumn(name = "campaign_id", insertable = false, updatable = false)  
}) 
private CampaignBroadcast broadcast; 
+1

Üyelik eşledikten ilk veri türü aldı çünkü bu olduğunu düşünüyorum - örtük eşleştirmesini misordered. –

+0

no'lu ek açıklamalardan gelen örtük sıralamaya güvenmek yerine, açık bağlayıcıları kullanmayı düşünün, bu durum geçerli değildir, çünkü başvurulanColumnName ile eşleşme çalışmadı. – renke

0

@JoinColumn numaralı ürününüze içbükecenmişHollanda Adını eklemeye çalışın. Eğer açıklanan hata ben neden tam emin değilim nedeniyle kompozit anahtar sütunları

@ManyToOne 
@JoinColumns({ 
    @JoinColumn(name = "campaign_id", referencedColumnName = "campaign_id", ...), 
    @JoinColumn(name = "broadcast_date", referencedColumnName = "broadcast_date", ...) }) 
private CampaignBroadcast broadcast; 
-1

Ben hazırda veri türü ve sütun diyordum aslında ne

İlgili konular