2015-10-19 3 views
11

Ich habe meinen Kopf herumgestoßen und versucht herauszufinden, was mit dem folgenden Mapping nicht stimmt. Ich verstehe, dass das folgende Mapping für ORM nicht ideal ist, aber so ist die Datenbank und ich kann ihre Struktur nicht ändern. Ich benutze JPA 2.1 und Hibernate 5.0.2.Final.Falscher TypeDescriptor bei der Verwendung von JoinColumns in einem Composite-Key

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

Neben dieser Struktur, ich habe auch einen Konverter LOCALDATE zu java.sql.Date, zu handhaben, die mit autoApply=true kommentiert wird.

Wenn ich versuche, CampaignBroadcastProcess durch entityManager.find() zu laden, überwintert versucht campaign_id to Date konvertieren, auch wenn es als String zugeordnet ist, java.sql.Date verursachte ein IllegalStateException zu werfen, weil der String zu valueOf bestand kein gültiges Datum String ist.

Ich bin misstrauisch Hibernate vermischt die Typen der JoinColumns unter CampaignBroadcastProcessPK und behandelt sie beide als LocalDate.

Hat jemand jemals dieses Problem konfrontiert?

Antwort

1

Ich bin mir nicht ganz sicher, warum, aber die Frage der Reihenfolge der beiden @JoinColum gelöst zu verändern. Die Abbildung ist nun wie folgt:

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

Das ist eigentlich das, was ich sagen will - implizite Abbildung misordered. Ziehen Sie die Verwendung expliziter Bindungen in Betracht, anstatt sich auf die implizite Reihenfolge zu verlassen, die von den Annotationen kommt. –

+0

Nein, dies war nicht der Fall, da selbst bei referencedColumnName das Mapping nicht funktionierte. – renke

0

Versuchen Sie, referencedColumnName explizit zu Ihrem hinzuzufügen. Der Fehler kann von Verbundschlüsselspalten aufgrund misordered implizite Abbildung beschrieben sein

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

Ich denke, das liegt daran, dass Hibernate den ersten Datentyp aufgenommen, den Datentyp war und kartiert sie Spalte Join

Verwandte Themen