2013-03-19 20 views
5
@MappedSuperclass 
public abstract class AbstractBaseModel{ } 

@MappedSuperclass 
public class Person extends AbstractBaseModel { } 

@Entity 
public class APerson extends Person { } 

@Entity 
public class BPerson extends Person { } 

@Entity 
public class Course extends AbstractBaseModel { 
    @ManyToOne 
    @JoinColumn(name ="person") 
    private Person person; 
} 

Sopra struttura darà un'eccezione:Hibernate Inheritance - Riferimento a un'entità annotato con @MappedSuperclass

Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on  
Course references an unknown entity: Person 

Si dice che non è possibile utilizzare persona nelle mappature perché non è un'entità concreta. Come ottengo uno scenario di ereditarietà del genere?

risposta

4

Semplice, si cambia il @MappedSuperclass annotazione Person per @Entity

Usa @MappedSuperclass solo dove esplicitamente non si vuole la classe di essere interrogabile, o una parte di una relazione. @Entity ovunque altro.

Una buona euristica per decidere è quello di vedere se il vostro superclasse è abstract - se si tratta - utilizzare @MappedSuperclass, come avete fatto sul AbstractBaseModel

+0

In tal caso, Hibernate crea solo classe Persona. Non ha creato APerson o BPerson. L'entità persona ha unito APerson e BPerson. – user706071

+0

@ user706071 - Non sono sicuro di cosa intendi. Hibernate non genera classi. In che modo APerson e BPerson sono diversi da Person? Può essere che non abbiano attributi aggiuntivi e le differenze siano solo comportamentali? – kostja

+0

Le classi di APerson e di BPerson hanno i propri attributi diversi da quelli comuni (Persona). Comunque, grazie per la risposta. Userò l'approccio che suggerisci. Hibernate ha creato una tabella denominata Persona che unisce tutti gli attributi di APerson e BPerson e ha aggiunto un attributo DTYPE per distinguere il tipo di sottoclasse. Poiché il mio APerson e il BPerson non sono molto diversi, questo tipo di eredità è applicabile a me. – user706071

0
@Entity 
@Table(name="PERSON") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="discriminator",discriminatorType=DiscriminatorType.STRING) 
public absract class Person extends AbstractBaseModel { } 

@Entity 
public class APerson extends Person { } 

@Entity 
public class BPerson extends Person { } 

@Entity 
public class Course extends AbstractBaseModel { 
    @ManyToOne 
    @JoinColumn(name ="person", **insertable = false, updatable = false**) 
    private Person person; 
} 
Problemi correlati