Hibernate JPA y la herencia Table_Per_class

votos
0

Tengo una entidad que es superclase

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = super_class)
public abstract class SuperClass implements Serializable {
    @Transient
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private long id;

    public abstract void initDefaultValues();

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

}

y algunas subclases que amplían la superclase.

@Entity
@Table(name = Subclass1)
public class Subclass1 extends SuperClass{

    private static final Logger log = LogManager
            .getLogger(Subclass1.class);
    @Transient
    private static final long serialVersionUID = 1L;

    // testcase configuration tab
    private String configurationTabTestServer;


    private String umtsRelease;


}

Las otras clases tienen el mismo aspecto.

Solía ​​tener ellos SINGLE_TABLE para el tipo de herencia, pero que querían que cada clase concreta que cada mesa. Debido a TABLE_PER_CLASS tuve que usar GenerationType.TABLE.

También tengo una clase de entidad que tiene una clave externa a la superclase

@Entity
@Table(name=myother_entity)
class Entity1{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @OneToOne(cascade = CascadeType.ALL)
    private SuperClass superclass;
    //more fields
}

Tenía una clase abstracta porque tengo una clase Entity1 que podría tener diferentes tipos de superclase. Nosotros no queremos crear diferentes clases y Entity1 Entity2 y Entity3 etc para cada subclase. Por ello hemos creado una clase Entity1 que puede tener un campo de tipo SuperClass, que podrían apuntar a cualquiera de las subclases.

En mi programa puedo crear muchos intances Entity1 que algunos de ellos que tienen diferentes tipos de superclase como valor del campo. Cada uno podía ser de subclass1 tipo o subclass2 etc. Al principio solía tener una sola tabla para todas las subclases. Todo funcionaba bien. Pero después decidimos dividir nuestras mesas de esto es lo que sucede. Cuando editar cualquier instancia Entity1, que ya ha puesto en campo SuperClass (usando una de las subclases), y guárdelo (fusionarla), entonces se crea una nueva instancia de mi Subclase asociado con mi ejemplo Entity1 y, a continuación, lo guarda en el base de datos. Así que tengo dos registros ahora sobre la mesa de la subclase. Esto no ocurrió cuando se utilizó un tipo de herencia SINGLE_TABLE. Es este comportamiento normal de APP y de hibernación?

Publicado el 03/08/2015 a las 15:29
por usuario
En otros idiomas...                            


1 respuestas

votos
0

Por favor, tenga en cuenta primero esto: DiscriminatorColumn y DiscriminatorValue anotaciones son específicas de enfoque de una sola mesa. Por lo que no se van a utilizar en las asignaciones de tabla-por-clase.

Ahora, vamos a ir a la cuestión:

En el mapeo tabla-por-clase, habrá dos registros con la misma ID: uno en una tabla padre, otros en una tabla secundaria.

Según entendí, en su caso, dos registros se escriben en la tabla secundaria, ¿verdad? Si es así, el problema debe ser al cargar los datos Entity1 de la base de datos. La propiedad "superclase" debe tener su sistema de identificación. Puede utilizar la carga ansiosa o perezosa para esto. Y comprobar si esa propiedad está cargado correctamente (en modo de depuración) con su conjunto de ID correcto antes de guardarla.

Otra manera es desactivar "cascada de persistir / fusionar" y para salvar las entidades por separado. Se le puede dar más seguridad a sus datos.

Puede encontrar más información aquí: http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html

Respondida el 03/08/2015 a las 16:01
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more