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?
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. –
Nein, dies war nicht der Fall, da selbst bei referencedColumnName das Mapping nicht funktionierte. – renke