Mi modelo de datos que representa las entidades legales, tales como una Empresa o una Persona. Ambos son impuestos que pagan las entidades, y ambos tienen un TaxID, una colección de números de teléfono, y una colección de direcciones de correo.

Tengo un Java modelo con dos clases concretas que extender 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 las Anotaciones JPA en un MySQL de la base de datos, con clases como esta:

@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 que se refieren a su propietario, que es un AbstractLegalEntity. Hibernate se queja:

@OneToOne or @ManyToOne on Phone references an unknown 
entity: AbstractLegalEntity

Parece que esta sería una forma bastante común de Java herencia escenario, así que espero que Hibernan lo apoyaría. He intentado cambiar la asignación para AbstractLegalEntity basado en un Hibernate en el foro de pregunta, ya no uso @MappedSuperclass:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

Sin embargo, ahora me sale el siguiente error. Al leer sobre esta herencia, el tipo de asignación, parece que tengo que usar la SECUENCIA de la no IDENTIDAD, y MySQL no soporta la SECUENCIA.

Cannot use identity column key generation with <union-subclass> 
mapping for: ConcreteBusinessEntity

Estoy haciendo más progresos hacia conseguir que las cosas funcionen cuando yo uso la siguiente asignación.

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
        name="entitytype",
        discriminatorType=DiscriminatorType.STRING
)

Estoy pensando que debo seguir por este camino. Mi preocupación es que yo soy de asignación como un @Entity cuando realmente no desea siempre una instancia de AbstractLegalEntity a existir siempre. Me gustaría saber si este es el enfoque correcto. ¿Cuál es el enfoque correcto que debo tomar para esta situación?

  • usted está usando JPA en modo de hibernación, no hibernate annotations. Esa es una distinción importante.
  • ah, sí, eso es correcto. gracias por la corrección en mi pregunta.
InformationsquelleAutor Tauren | 2010-11-24

3 Comentarios

  1. 42

    Uso:

    @Entity
    @Inheritance(strategy = InheritanceType.JOINED)
    AbstractLegalEntity

    A continuación, en la base de datos tendrá una tabla para AbstractLegalEntity y tablas para las clases que se extiende AbstractLegalEntity clase. Usted no tiene instancias de AbstractLegalEntity si es abstracta. El polimorfismo puede ser usado aquí.

    Cuando se utiliza:

    @MappedSuperclass
    AbstractLegalEntity
    
    @Entity
    ConcretePersonEntity extends AbstractLegalEntity

    Se crea en la base de datos de una sola tabla ConcretePersonEntity pero con columnas de ambas clases.

    • gracias, esto ayuda a aclarar las cosas. yo también era capaz de usar SINGLE_TABLE así, lo que tiene sentido cuando quiero menos combinaciones y no hay toneladas de campos en la jerarquía de clases.
    • +1 yo tengo un problema similar. Está usted dispuesto a ayudarme con ello? En particular, necesito ayuda con el DDL y las definiciones de entidad. He publicado mi código. Aquí está el enlace: stackoverflow.com/questions/25252541/…
    • gran. es trabajo
  2. 1

    Agregar @Entity anotación a AbstractLegalEntity. Ejemplo de AbstractLegalEntity nunca va a existir – hibernate carga apropiada la ampliación de las instancias – ConcreteBusinessEntity o ConcretePersonEntity de acuerdo al campo de Id.

    • Una clase NO puede ser marcado como @Entity y @MappedSuperClass !
  3. 1

    Usted tiene que declarar AbstracLegalEntity como un @Entity. Incluso con la @Entity anotación, su clase sigue siendo abstracto. en consecuencia, usted sólo tendrá instancia de hormigón subclases.

Dejar respuesta

Please enter your comment!
Please enter your name here