@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Problem {
@ManyToOne
private Person person;
}
@Entity
@DiscriminatorValue("UP")
public class UglyProblem extends Problem {}
@Entity
public class Person {
@OneToMany(mappedBy="person")
private List<UglyProblem> problems;
}
Creo que está bastante claro lo que intento hacer. Espero que la persona @ManyToOne sea heredada por la clase UglyProblem. Pero habrá una excepción que diga algo así como: "No se encontraron tales propiedades en la clase UglyProblem (mappedBy =" person ")".Por qué @OneToMany no funciona con herencia en Hibernate
Todo lo que encontré es this. No pude encontrar la publicación de Emmanuel Bernard explicando las razones detrás de esto.
Por desgracia, según la documentación de Hibernate "Propiedades de superclases no asignada como @MappedSuperclass se ignoran."
Bueno, yo creo que esto significa que si tengo estas dos clases:
public class A {
private int foo;
}
@Entity
public class B extens A {
}
continuación campo foo
no se asignarán a la clase B. Lo cual tiene sentido. Pero si tengo algo como esto:
@Entity
public class Problem {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Entity
public class UglyProblem extends Problem {
private int levelOfUgliness;
public int getLevelOfUgliness() {
return levelOfUgliness;
}
public void setLevelOfUgliness(int levelOfUgliness) {
this.levelOfUgliness = levelOfUgliness;
}
}
que esperar que el UglyProblem clase para tener campos campos id
y name
y ambas clases para ser mapeados usando una misma mesa. (De hecho, esto es exactamente lo que sucede, recién lo he comprobado). Tengo esta tabla:
CREATE TABLE "problem" (
"DTYPE" varchar(31) NOT NULL,
"id" bigint(20) NOT NULL auto_increment,
"name" varchar(255) default NULL,
"levelOfUgliness" int(11) default NULL,
PRIMARY KEY ("id")
) AUTO_INCREMENT=2;
Volviendo a mi pregunta: ¿
espero @ManyToOne persona a ser heredada por clase UglyProblem.
Supongo que porque todos los demás campos asignados se heredan y no veo ninguna razón para hacer esta excepción para las relaciones ManyToOne.
Sí, lo vi. De hecho, utilicé la solución de solo lectura para mi caso. Pero mi pregunta fue "Por qué ..." :). Sé que hay una explicación dada por un miembro del equipo de hibernación. No pude encontrarlo y es por eso que pregunté.
Quiero conocer la motivación de esta decisión de diseño.
(si le interesó cómo he enfrentado este problema: heredé un proyecto creado usando hibernate 3. Era Jboss 4.0. Algo + hibernación ya estaba allí (lo descargarían todos juntos). Estaba moviendo este proyecto a Jboss 4.2.2 y descubrí que hay asignaciones de "@OneToMany mappedBy" heredados y funcionó muy bien en la configuración de edad ...)
se debe añadir más detalles sobre su edición el 4 de septiembre.Especificar la lista en lugar de solo la Lista en el mapeo @OneToMany (mappedBy = "person") cambia la naturaleza del problema, ya que creo que previamente asumimos que deseaba asignar una Persona a una lista de Problemas (no Ugl –