Mi modelo de datos representa entidades legales, como una empresa o una persona. Ambas son entidades que pagan impuestos, y ambas tienen un TaxID, una colección de números de teléfono y una colección de direcciones postales.Hibernate (APP) mapeo herencia de clases abstractas súper
que tienen un modelo de Java con dos clases concretas que se extienden una clase abstracta. La clase abstracta tiene propiedades y colecciones que son comunes a ambas clases concretas.
AbstractLegalEntity ConcreteBusinessEntity ConcretePersonEntity
------------------- ---------------------- --------------------
Set<Phone> phones String name String first
Set<Address> addresses BusinessType type String last
String taxId String middle
Address Phone
------- -----
AbsractLegalEntity owner AbstractLegalEntity owner
String street1 String number
String street2
String city
String state
String zip
estoy usando Hibernate anotaciones JPA en una base de datos MySQL , con las clases de la siguiente manera:
@MappedSuperclass
public abstract class AbstractLegalEntity {
private Long id; // Getter annotated with @Id @Generated
private Set<Phone> phones = new HashSet<Phone>(); // @OneToMany
private Set<Address> address = new HashSet<Address>(); // @OneToMany
private String taxId;
}
@Entity
public class ConcretePersonEntity extends AbstractLegalEntity {
private String first;
private String last;
private String middle;
}
@Entity
public class Phone {
private AbstractLegalEntity owner; // Getter annotated @ManyToOne @JoinColumn
private Long id;
private String number;
}
El problema es que Phone
y Address
objetos necesitan para hacer referencia a su propietario, que es un AbstractLegalEntity
. Hibernate se queja:
@OneToOne or @ManyToOne on Phone references an unknown
entity: AbstractLegalEntity
Parece que este sería un escenario bastante común herencia de Java, así que espero que Hibernate lo apoyaría. He intentado cambiar la asignación para AbstractLegalEntity basado en un Hibernate forum question, que ya no utilizan @MappedSuperclass
:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
Sin embargo, ahora me sale el siguiente error. Al leer en este tipo de mapeo de herencia, parece que tengo que usar SEQUENCE not IDENTITY, y MySQL no admite SEQUENCE.
Cannot use identity column key generation with <union-subclass>
mapping for: ConcreteBusinessEntity
Estoy haciendo más progresos para que las cosas funcionen cuando utilizo la siguiente asignación.
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
name="entitytype",
discriminatorType=DiscriminatorType.STRING
)
Estoy pensando que debería continuar por este camino. Mi preocupación es que lo estoy mapeando como @Entity
cuando realmente no quiero que exista nunca una instancia de AbstractLegalEntity. Me gustaría saber si este es el enfoque correcto. ¿Cuál es el enfoque correcto que debería tomar para esta situación?
está utilizando anotaciones JPA en hibernación, no en anotaciones de hibernación. Esa es una distinción importante. –
@ S.P.Floyd - ah sí, eso es correcto. gracias por corregirlo en mi pregunta. – Tauren