2015-12-16 11 views
5

Sto utilizzando Spring Boot 1.3 con Spring Data JPA. Desidero utilizzare la generazione di chiavi primarie in anticipo utilizzando un oggetto dedicato per la chiave primaria (come consigliato in Implementing Domain Driven Design).L'entità non ha una proprietà ID persistente quando si estrae una superclasse dalla classe @EmbeddedId

Supponiamo questa entità:

@Entity 
public class Book { 
    @EmbeddedId 
    private BookId id; 
} 

e questo oggetto di valore:

@Embeddable 
public class BookId implements Serializable { 

    private UUID id; 

    protected BookId(){} //for hibernate 

    public BookId(UUID id) { 
    this.id = id; 
    } 

    public UUID getId() { 
    return id; 
    } 
} 

Allora questo funziona bene. Tuttavia, voglio creare una superclasse per tutte le classi id, qualcosa di simile:

public class EntityUuidId implements Serializable { 

    private UUID id; 

    protected EntityUuidId(){} //for hibernate 

    public EntityUuidId(UUID id) { 
    this.id = id; 
    } 

    public UUID getId() { 
    return id; 
    } 
} 

Ora i cambiamenti di classe BookID a:

@Embeddable 
public class BookId extends EntityUuidId { 

    protected BookId(){} //for hibernate 

    public BookId(UUID id) { 
    super(id); 
    } 
} 

Il problema ora è quando faccio funzionare la mia domanda è la seguente eccezione:

org.hibernate.AnnotationException: BookId has no persistent id property: Book.id 

Perché improvvisamente non funziona più?

+0

infatti, poiché "id" non fa parte di alcuna classe annotata JPA, quindi non è persistente. Si potrebbe avere getter/setter per l'id nella sottoclasse. –

+0

Non sono sicuro che '@ MappedSupperclass' possa essere usato come genitore di' @ Embeddable', ma potrebbe valere la pena di provarlo. –

+0

EclipseLink sembra supportarlo: [collegamento] (https://bugs.eclipse.org/bugs/show_bug.cgi?id=283028) –

risposta

6

Put su EntityUuidId classe, in questo modo le sue proprietà saranno trattate come persistenti.

Problemi correlati