Anotaciones de Hibernate ¿Cómo puedo anular/ignorar un miembro de identificación heredado?

Me estoy extendiendo desde una clase base de utilidad que asigna id a columnas

@MappedSuperclass
public abstract class BaseDTO
{
     @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public int id;
    public int getId() {
        return id;}

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

Esta clase se usa en muchas clases derivadas para proporcionar operaciones y acceso simplificado a las tablas que contienen columnas de id. es decir

BaseDTO->DBAbstractClass1->DBAbstract2->MyClassDTO
BaseDTO->DBAbstractClass1->DBAbstract3->AnotherADTO
BaseDTO->DBAbstractClass2->DBAbstract4->AnotherBDTO

etc.

Ahora encuentro que tengo una tabla asignada a MyClassDTO que no tiene una columna 'id' (tiene una columna llamada 'identificador') pero debido a restricciones arquitectónicas, se extiende según las causas normales:

[org.hibernate.util.JDBCExceptionReporter] SQL Error: 1054, SQLState: 42S22
[org.hibernate.util.JDBCExceptionReporter] Unknown column 'this_.id' in 'field list'

Intenté anular el miembro de identificación como @Transient, agregar un nuevo @Id, etc., pero siempre obtengo el error anterior.

O encuentro una forma de 'ignorar' o reemplazar la identificación heredada o necesito copiar mis clases heredadas y no extender BaseDTO, que es algo que un buen programador debería evitar.

He visto algo similar en Hibernate: cómo anular un atributo de la superclase mapeada pero no estoy seguro de que resuelva mi problema exacto.

Probablemente sea una anulación simple, pero debe tener cuidado de que no haya efectos secundarios. ¿Ningún arrendatario?

preguntado el 03 de mayo de 12 a las 16:05

2 Respuestas

No he encontrado una solución simple y elegante para esto.

Lo que he hecho es invertir la jerarquía para crear dos clases HelperDTO, una que extiende a la otra y la segunda incluye la propiedad id. HelperDTO no tiene miembro de identificación y HelperWithIdDTO tiene un miembro de identificación, es decir

HelperDTO->MyClassDTO (classes that do not use id)

y

HelperDTO->HelperWithIdDTO->OtherDTO (classes that use id)

contestado el 08 de mayo de 12 a las 14:05

Intente anular en su subclase estos cambios en el super ?

@MappedSuperclass
public abstract class BaseDTO
{

    public int id;
    public int getId() {
        return id;}

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public void setId(int id) {
        this.id = id;}
}

contestado el 03 de mayo de 12 a las 17:05

Hice lo que me pediste anteriormente y agregué lo siguiente a la clase derivada ` @Transient` public int id; @Id @GeneratedValue(strategy=GenerationType.AUTO) private long other_id; y obtuve el siguiente error La creación inicial de SessionFactory falló.org.hibernate.AnnotationException: No se especificó ningún identificador para la entidad: com.mine.something.AnotherDTO - antonio palmer

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.