2015-10-19 12 views
11

Ho sbattuto la testa, cercando di capire cosa c'è di sbagliato nella seguente mappatura. Capisco che il seguente mapping non è l'ideale per ORM, ma è così che il database è e non posso cambiare la sua struttura. Sto usando JPA 2.1 e Hibernate 5.0.2.Final.Wrong TypeDescriptor quando si utilizza JoinColumns in un tasto composito

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

Inoltre questa struttura, ho anche un convertitore per gestire LocalDate a java.sql.Date, che viene annotata con autoApply=true.

quando provo a caricare CampaignBroadcastProcess attraverso entityManager.find(), Hibernate cerca di convertire campaign_id fino ad oggi, anche se è mappato come stringa, causando java.sql.Date di gettare un IllegalStateException, perché la stringa passata a valueOf non è una data stringa valida.

Sono sospettoso Hibernate sta mescolando i tipi di JoinColumns su CampaignBroadcastProcessPK, gestendoli entrambi come LocalDate.

Qualcuno ha mai affrontato questo problema?

risposta

1

Io non sono esattamente sicuro perché, ma cambiando l'ordine dei due @JoinColum risolto il problema. La mappatura ora è la seguente:

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

che in realtà è quello che stavo dicendo - misordered mappatura implicita. Prendi in considerazione l'uso di associazioni esplicite piuttosto che fare affidamento sull'ordine implicito proveniente dalle annotazioni –

+0

No, non era il caso, poiché anche con referencedColumnName la mappatura non funzionava. – renke

0

Prova ad aggiungere esplicito riferimentoColumnName al tuo @JoinColumn. L'errore che hai descritto può essere dovuto a misordered mappatura implicita di colonne chiave composte

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

Penso che questo sia perché hibernate scelto il primo tipo di dati che era il tipo di dati e mappato al Join colonna

Problemi correlati