usar sirve qué que puede para metodo llamar herencia ejemplos donde cuando como comando clase java inheritance jpa annotations

java - sirve - ¿Es posible agregar una anotación JPA a las variables de instancia de superclase?



¿donde se puede usar el constructor super()? (4)

Estoy creando entidades que son iguales para dos tablas diferentes. Para hacer mapeos de tablas, etc., son diferentes para las dos entidades, pero solo tienen el resto del código en un solo lugar: una superclase abstracta. Lo mejor sería poder anotar elementos genéricos, como los nombres de las columnas (ya que serán idénticos) en la superclase, pero eso no funciona porque las clases secundarias no heredan las anotaciones JPA. Aquí hay un ejemplo:

public abstract class MyAbstractEntity { @Column(name="PROPERTY") //This will not be inherited and is therefore useless here protected String property; public String getProperty() { return this.property; } //setters, hashCode, equals etc. methods }

Que me gustaría heredar y solo especificar las cosas específicas del niño, como las anotaciones:

@Entity @Table(name="MY_ENTITY_TABLE") public class MyEntity extends MyAbstractEntity { //This will not work since this field does not override the super class field, thus the setters and getters break. @Column(name="PROPERTY") protected String property; }

¿Alguna idea o tendré que crear campos, getters y setters en las clases para niños?

Gracias, Kris


Anotar tu clase base con @MappedSuperclass debería hacer exactamente lo que quieres.


Aquí hay un ejemplo con algunas explicaciones que pueden ayudar.

@MappedSuperclass:

  • Es una clase de conveniencia
  • Se usa para almacenar estado compartido y comportamiento disponible para clases de niños
  • No es persistente
  • Solo las clases de niños son persistentes

@Herencia especifica una de las tres estrategias de mapeo:

  1. Mesa individual
  2. Unido
  3. Tabla por clase

@DiscriminatorColumn se usa para definir qué columna se usará para distinguir entre objetos secundarios.

@DiscriminatorValue se usa para especificar un valor que se usa para distinguir un objeto secundario.

El siguiente código da como resultado lo siguiente:

Puede ver que el campo id está en ambas tablas, pero solo está especificado en AbstractEntityId @MappedSuperclass.

Además, @DisciminatorColumn se muestra como PARTY_TYPE en la tabla Party.

El @DiscriminatorValue se muestra como Persona como un registro en la columna PARTY_TYPE de la tabla Party.

Muy importante, la clase AbstractEntityId no persiste en absoluto.

No he especificado anotaciones @Column y en su lugar solo confío en los valores predeterminados.

Si agregó una entidad de la Organización que extendió la Parte y si eso persistía a continuación, entonces la tabla de la Parte tendría:

  • id = 2
  • PARTY_TYPE = "Organización"

La primera entrada de la tabla Organización tendría:

  • id = 2
  • otro valor de atributo asociado específicamente con organizaciones

@MappedSuperclass @SequenceGenerator(name = "sequenceGenerator", initialValue = 1, allocationSize = 1) public class AbstractEntityId implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(generator = "sequenceGenerator") protected Long id; public AbstractEntityId() {} public Long getId() { return id; } } @Entity @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColumn(name = "PARTY_TYPE", discriminatorType = DiscriminatorType.STRING) public class Party extends AbstractEntityId { public Party() {} } @Entity @DiscriminatorValue("Person") public class Person extends Party { private String givenName; private String familyName; private String preferredName; @Temporal(TemporalType.DATE) private Date dateOfBirth; private String gender; public Person() {} // getter & setters etc. }

Espero que esto ayude :)


Es posible que desee anotar MyAbstractEntity con la clase @MappedSuperclass para que hibernate importe la configuración de MyAbstractEntity en el elemento secundario y no tendrá que anular el campo, solo use el padre. Esa anotación es la señal para hibernar que también tiene que examinar la clase principal. De lo contrario, asume que puede ignorarlo.


Marque la superclase como

@MappedSuperclass

y eliminar la propiedad de la clase secundaria.