2015-10-19 12 views
11

Obijałem głowę, próbując zrozumieć, co jest nie tak z poniższym odwzorowaniem. Rozumiem, że następujące odwzorowanie nie jest idealne dla ORM, ale w ten sposób jest baza danych i nie mogę zmienić jej struktury. Używam JPA 2.1 i Hibernate 5.0.2.Final.Niepoprawny TypeDescriptor przy użyciu JoinColumns w kluczu złożonym

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

Poza tym struktury, ja też mam konwerter do obsługi LOCALDATE do java.sql.Date, która jest z dopiskiem autoApply=true.

Kiedy próbuję załadować CampaignBroadcastProcess przez entityManager.find(), hibernacja próbuje konwertować campaign_id do tej pory, mimo że jest odwzorowany jako String, powodując java.sql.Date aby rzucić IllegalStateException, ponieważ String przekazywany do valueOf nie jest ważna data String.

Jestem podejrzany. Hibernacja miesza typy kolumn JoinColumn na CampaignBroadcastProcessPK, obsługując je jako lokalną.

Czy ktoś kiedykolwiek stanął w obliczu tego problemu?

Odpowiedz

1

Nie jestem do końca pewien dlaczego, ale zmieniając kolejność dwóch @JoinColum rozwiązać ten problem. Mapowanie teraz jest jak poniżej:

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

To rzeczywiście to, co mówię - misordered niejawny mapowanie. Rozważ skorzystanie z jawnych powiązań zamiast polegania na ukrytej kolejności pochodzącej z adnotacji. –

+0

Nie, nie miało to miejsca, ponieważ nawet przy odwoływanej kolumnie nazwa nie działało. – renke

0

Spróbuj dodać jawnie referencedColumnName do swojej @JoinColumn. Błąd opisałeś może być spowodowane misordered niejawny mapowanie kompozytowych kluczowych kolumn

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

Myślę, że to dlatego, hibernacji odebrał pierwszy typ danych, który był typ danych i mapowane je Dołącz kolumna

Powiązane problemy