11
votes

Comment mapper une classe à des tables différentes à l'aide d'annotations Hibernate / JPA

Je suis actuellement coincé avec ce qui semble être un problème très simple, mais je ne peux tout simplement pas sembler trouver un moyen de trouver:

J'ai 2 identiques Tables:

  1. tbl_creditcard_approved_txns
  2. TBL_CREDITCARD_DECLINE_TXNS

    Les champs des deux sont identiques et j'ai une classe - transaction utilisé pour représenter tous les champs appropriés dans les tableaux.

    J'essaie de cartographier deux entités différentes (une pour chaque table) à la classe ci-dessus. Dans le vieux monde, j'aurais créé deux fichiers hbm.xml , un pour chaque table et cartographier les deux à transaction . J'utiliserais ensuite le nom de l'entité pendant la persistance pour vous assurer que l'objet est persisté dans la table correcte, en fonction de la situation.

    J'essaie d'utiliser des annotations actuellement pour obtenir la même chose, mais n'avait pas de chance jusqu'à mapper les 2 entités à une classe Single . Est-ce possible?

    Je suis actuellement en train d'utiliser une approche différente dans celle que j'ai extraite tous les champs communs (noms de colonne identiques) dans un @mapsuperclass et ont créé deux classes distinctes (une pour chaque entité) qui s'étendez de la super classe (ces classes ont simplement les mêmes champs avec différents noms de colonnes, le cas échéant).


2 commentaires

duplicaté possible de JPA, comment utiliser la même classe (entité) pour mapper différentes tables?


Pascal, c'est bien l'intention, la seule différence étant que je voudrais que deux entités différentes soignées à la même classe. Contrairement à la JPA, dans Hibernate, les classes peuvent être disparates des entités. En substance, cependant, j'essaie vraiment de cartographier une classe à deux tables.


3 Réponses :


20
votes

Utilisation @mapsuperclass, vous procédez comme suit:

@MappedSuperclass
public class Transaction ...

@Entity
@Table(name="tbl_creditcard_approved_txns")
public class DeclinedTransaction extends Transaction ...

@Entity
@Table(name="tbl_creditcard_declined_txns")
public class ApprovedTransaction extends Transaction ...


3 commentaires

Les2, merci, pour la réponse. Ce que vous avez suggéré est l'approche que j'ai prise actuellement. Comme vous l'avez observé, je me demandais si il est possible de mapper une entité à deux tables différentes.


Si je déplace une rangée d'une table à l'autre, comment puis-je vous assurer que l'ID de la rangée est maintenu de la même manière?


Cela ressemble à une mauvaise idée, mais je ne suis pas tout à fait sûr pourquoi :) C'est juste contre mes instincts. Quel est le cas d'utilisation pour garder l'ID de ligne identique?



2
votes

L'autre moyen de le faire serait d'utiliser une table partitionnée sur la couche de base de données qui rendrait alors visible une table unique à votre code Java.

Ceci est probablement la voie à suivre en règle générale, plus vous faites partitionnement intelligent, plus votre requête peut être plus rapide.


0 commentaires

2
votes

Vous devez utiliser deux unités de persistance différentes ou deux entités distinctes. Cela a déjà été répondu à ici .


0 commentaires