2009-05-07 6 views
9

que tienen un esquema legado que no se puede cambiar. Estoy usando una clase base para las características comunes y contiene un objeto incrustado. Hay un campo que normalmente se mapea en el objeto incrustado que debe estar en la identificación de persistencia para una sola (de muchas) subclases. He creado una nueva clase de identificación que lo incluye, pero luego aparece el error de que el campo está mapeado dos veces. Aquí hay un código de ejemplo que se simplifica mucho para mantener la cordura del lector:¿Cómo hacer que un campo mapeado sea heredado de una superclase transitoria en JPA?

@MappedSuperclass 
class BaseClass { 
    @Embedded 
    private Data data; 
} 

@Entity 
class SubClass extends BaseClass { 
    @EmbeddedId 
    private SubClassId id; 
} 

@Embeddable 
class Data { 
    private int location; 

    private String name; 
} 

@Embeddable 
class SubClassId { 
    private int thingy; 

    private int location; 
} 

He tratado @AttributeOverride pero sólo se puede conseguir que se cambie el nombre del campo. Intenté establecerlo en updatable = false, insertable = false pero esto no pareció funcionar cuando se usó en la anotación @AttributeOverride. Consulte la respuesta a continuación para encontrar la solución a este problema.

Me doy cuenta de que podría cambiar la clase base, pero realmente no quiero dividir el objeto incrustado para separar el campo compartido, ya que haría el código circundante más complejo y requeriría un código de envoltura feo. También podría rediseñar todo el sistema para este caso de esquina, pero realmente preferiría no hacerlo.

estoy usando Hibernate como profesional de la APP.

Respuesta

5

he encontrado razón AttributeOverride no estaba funcionando. Al anotar la clase, debe incluir el identificador del objeto incrustado en el campo de nombre. Yo estaba haciendo esto:

@Entity 
@AttributeOverride(name = "location", column = @Column(name = "location", insertable = false, updatable = false) 
class SubClass extends BaseClass { 

Cuando tenía que ser esta:

@Entity 
@AttributeOverride(name = "data.location", column = @Column(name = "location", insertable = false, updatable = false) 
class SubClass extends BaseClass { 

Lo extraño es que el cambio de campo de nombre de la @ de la columna hizo el trabajo con la primera versión pero el insertable y campos actualizables fueron ignorados . No sé si eso es un error o una sutileza de la especificación de JPA.

De todos modos, esto no resuelve cómo hacer que el campo de sólo lectura, pero no responde a la pregunta original: ¿Es posible hacer que un campo de una superclase asignada transitoria?

+0

Sé que esto es de 6 años de edad ahora, pero ¿alguna vez encontrar una solución a esta pregunta? Y/o recordar lo que era? –

+0

@EricB. Lo siento, nunca he encontrado una forma de no heredar un campo mapeado. No creo que sea posible hacerlo. Creo que podrían verlo como si trataran de reducir la visibilidad de un método heredado en Java, por lo que se oponen a las reglas. En mi caso, trabajé alrededor de la caja de la esquina, que es un poco fea, pero era la única opción. –

Cuestiones relacionadas