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ù?
infatti, poiché "id" non fa parte di alcuna classe annotata JPA, quindi non è persistente. Si potrebbe avere getter/setter per l'id nella sottoclasse. –
Non sono sicuro che '@ MappedSupperclass' possa essere usato come genitore di' @ Embeddable', ma potrebbe valere la pena di provarlo. –
EclipseLink sembra supportarlo: [collegamento] (https://bugs.eclipse.org/bugs/show_bug.cgi?id=283028) –