2010-12-23 10 views
7

Tengo el siguiente esquema de DB (simplificado)¿Es posible mapear un campo en una entidad sin definir ninguna asociación?

MainTable(
    ID primary key 
    SOMEFIELD 
    CODE_FK1 -- references OtherTable1 CODE (without declared foreign key) 
    CODE_FK2 -- references OtherTable2 CODE (without declared foreign key) 
    ... Other fields used 
) 

OtherTable1(
    CODE primary key 
    LABEL 
    ... other fields not used 
) 

OtherTable2(
    CODE primary key 
    LABEL 
    ... other fields not used 
) 

que estoy preguntando si hay alguna manera de definir mi Entidad para la mesa principal con el fin de utilizar etiquetas directamente desde mis otras tablas, es decir, sin definir entidades para estas otras tablas.

No puedo cambiar el esquema de base de datos, que es realmente horrible (hay parejas de etiquetas/códigos en todas partes, definidas en tablas múltiples). Y si fuera posible, esta solución permitiría mantener mi código simple, ya que realmente no necesito estas otras entidades.

supongo que resultaría algo así:

@Entity 
public class MainEntity{ 
    @Id 
    private Integer ID; 

    @Column(name="SOMEFIELD") 
    private String SomeField; 

    @SomeAnnotation to Join CODE_FK_1 with OtherTable1.CODE 
    @SomeAnnotation like @Column(name="LABEL", table="OtherTable1") 
    private String Label1; 

    @SomeAnnotation to Join CODE_FK_1 with OtherTable1.CODE 
    @SomeAnnotation like @Column(name="LABEL", table="OtherTable1") 
    private String Label1; 

} 

Gracias por adelantado por su ayuda!

+1

realmente dudo si esto es posible con la APP (en las relaciones a nivel de entidad con se definen otras entidades, no la forma de obtener los campos en entidades unidas). ¿Ha considerado esas dos opciones: a) asignar todas las tablas relevantes a las entidades JPA y realizar consultas cuando las necesite; b) ¿usar JDBC para simplificar la vida, si no hay mucha interacción DB? –

Respuesta

12

Otra posibilidad sería utilizar la anotación @Formula a buscar el valor de la otra tabla. Esto generará automáticamente una subselección cada vez que cargue su Entidad.

creo que necesita algo como esto:

@Entity 
public class MainEntity{ 
    @Id 
    private Integer ID; 

    @Column(name="SOMEFIELD") 
    private String SomeField; 

    @Formula("(SELECT ot1.LABEL FROM OtherTable1 ot1 WHERE ot1.CODE = CODE_FK_1)") 
    private String Label1; 

} 

Hay poca información sobre esto en los documentos [Hibernate] [1], lo que puede tener un poco de ensayo y error para hacerlo bien (pero usted debería ser capaz de resolverlo con hibernate.show_sql=true

Hay 2 posibles desventajas de este enfoque:.

  1. este es el código de hibernación específica
  2. Esta es SQL normal, y por lo tanto puede ser de base de datos específica

HTH

[1]: http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-hibspec-property documentos de hibernación

+1

Hombre. Me salvaste unas 2 horas de trabajo. Muchas gracias! –

1
+0

Gracias por su sugerencia, pero ya lo hemos intentado. De hecho, obtuvimos una excepción: org.hibernate.AnnotationException: SecondaryTable JoinColumn no puede hacer referencia a una clave no primaria. Encontré un problema publicado en el rastreador de errores de Hibernate: http://opensource.atlassian.com/projects/hibernate/browse/HHH-4987. – mdomenjoud

+0

Entonces recomiendo comentar en esa JIRA. No se olvide de proporcionar un caso de prueba :-) De lo contrario, seguirá siendo un error en la próxima versión. – jpkrohling

+0

La publicación contiene un enlace roto ... – slartidan

Cuestiones relacionadas