2010-12-23 2 views
7

J'ai le schéma suivant dans le DB (simplifié)Est-il possible de mapper un champ dans une entité sans définir d'association?

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 
) 

Je me demande s'il y a un moyen de définir mon entité pour la table principale afin d'utiliser des étiquettes directement de mes autres tables, soit sans définir des entités pour ces autres tables.

Je ne peux pas changer le schéma DB, ce qui est vraiment horrible (il y a des labels/couples de code partout, définis dans plusieurs tables). Et si c'était possible, cette solution permettrait de garder mon code simple, puisque je n'ai pas vraiment besoin de ces autres entités.

Je suppose que cela entraînerait quelque chose comme ça:

@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; 

} 

Merci par avance pour votre aide!

+1

Je doute vraiment si cela est possible avec JPA (sur les relations au niveau des entités avec d'autres entités sont définies, pas la manière d'obtenir les champs dans les entités jointes). Avez-vous considéré ces deux options: a) mappez toutes les tables pertinentes aux entités JPA et effectuez une requête quand vous en avez besoin; b) utiliser JDBC pour simplifier la vie, s'il n'y a pas beaucoup d'interaction DB? –

Répondre

12

Une autre possibilité serait d'utiliser l'annotation @Formula pour récupérer la valeur de l'autre table. Cela générera automatiquement une sous-sélection chaque fois que vous chargez votre Entité.

Je pense que vous aurez besoin de quelque chose comme ceci:

@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; 

} 

Il y a peu d'informations à ce sujet dans les [Hibernate docs] [1], de sorte que vous devrez peut-être quelques essais et erreurs pour obtenir ce droit (mais vous devriez être en mesure de le travailler avec hibernate.show_sql=true

il y a 2 inconvénients possibles à cette approche:.

  1. ce code spécifique est mise en veille prolongée
  2. -
  3. Ceci est SQL simple, et peut donc être la base de données spécifique

HTH

[1]: http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-hibspec-property mise en veille prolongée docs

+1

Man. Vous m'avez sauvé environ 2 heures de travail. Merci beaucoup! –

1
+0

Merci pour votre suggestion, mais nous l'avons essayé. En fait, nous avons obtenu une exception: org.hibernate.AnnotationException: SecondaryTable JoinColumn ne peut pas référencer une clé non primaire. J'ai trouvé un problème sur le bugtracker de Hibernate: http://opensource.atlassian.com/projects/hibernate/browse/HHH-4987. – mdomenjoud

+0

Ensuite, je recommande de commenter dans cette JIRA. N'oubliez pas de fournir un cas de test :-) Sinon, ce sera toujours un bug dans la prochaine version. – jpkrohling

+0

Le message contient un lien brisé ... – slartidan

Questions connexes