2010-03-15 2 views
11

J'utilise JPA et j'ai besoin de faire de la "tableName" une variable.Dans @Table (name = "tableName") - Rendre "tableName" une variable dans JPA

Dans une base de données, j'ai plusieurs tables, et mon code doit accéder à la table où je l'ai spécifié à lire.

@Entity 
@Table(name = "tableName") 
public class Database implements Serializable {...............} 

Des idées?

+0

* "mon code doit accéder à la table où je l'ai spécifié." * Pourriez-vous clarifier ce que vous essayez de faire? –

+0

S'il vous plaît voir mon commentaire pour répondre 1. Merci. – zengr

+0

Pour reformuler: j'ai besoin d'un schéma dynamique. Où la table est créée à la volée. – zengr

Répondre

4

Vous pouvez faire quelque chose comme ceci, si c'est votre problème, je suppose. Jamais essayé, c'est juste une conjecture sauvage. Mais c'est la pratique habituelle - je suis pour les requêtes nommées; oui, c'est complètement différent.

@Entity 
@Table(name = Database.tableName) 
public class Database implements Serializable { 
    public static final String tableName = "TABLE_1"; 
    ............... 
} 

Mais je ne vois pas pourquoi quelqu'un le ferait. Pourriez-vous nous dire ce que vous faites? Pourquoi avez-vous quelques tables exactement la même définition?

[Modifié]

J'ai essayé votre solution. Il n'a pas de travail, il dit: La valeur pour attribut d'annotation Table.name doit être une expression constante.

Alors, n'est-ce pas assez clair? Je veux dire que tu ne peux pas faire ça. Et je crois que c'est assez logique. Si vous voulez que Hibernate génère votre schéma, vous pouvez définir toutes les entités que vous voulez, dans le schéma, et avec les relations appropriées.

+1

Ok, c'est mon scénario. J'ai une classe de JPA appelée "base de données" et je peux avoir beaucoup de nombre de tables (selon les données d'entrée du côté de client).Donc, pour l'instant, la classe Database ne crée qu'une seule table lorsqu'elle est exécutée (@Table = name). Mais j'ai besoin de cette classe pour créer des tables à l'exécution avec la variable TableName venant de quelque part ailleurs. J'ai essayé votre solution. Cela ne fonctionnait pas, il est dit: La valeur de l'attribut d'annotation Table.name doit être une expression constante. – zengr

+0

Pour reformuler: j'ai besoin d'un schéma dynamique. Où la table est créée à la volée. – zengr

+0

@zengr: Jetez un coup d'œil à mon addendum à la publication. –

2

La spécification du nom de la table lors de l'exécution n'est pas possible, ce n'est tout simplement pas le fonctionnement de JPA (et je ne suis toujours pas sûr de connaître vos besoins). Mapper des entités différentes sur votre ensemble de tables et exécuter diverses requêtes ou les construire dynamiquement (peut-être en utilisant l'API Criteria) en fonction de l'entrée du côté client ou utiliser autre chose que JPA (comme iBATIS).

+0

Est-ce une solution de contournement possible? http://java.dzone.com/articles/hibernate-dynamic-table-routin – zengr

+1

@zengr Je ne peux pas répondre à cette question, je ne comprends toujours pas ce que vous essayez de faire. Des tables dynamiques? Différents schémas? Ce n'est pas clair. –

+0

@zengr Il semble que ce lien fasse ce que vous voulez (bien qu'il puisse complètement obscurcir les choses pour un ingénieur de maintenance). Hibernate Shards est aussi une option intéressante. Mais quand vous allez dans cette direction, demandez-vous plusieurs fois "Avez-vous vraiment besoin de cela?". Votre projet est-il vraiment très complexe pour justifier cette solution complexe? –

3

Si vous voulez seulement référencer/lire le nom de la table, c'est possible comme dans le code ci-dessous. Si vous voulez changer, ce n'est pas possible comme l'a dit Pascal.

@Entity 
@Table(name = Database.tableName) 
public class Database implements Serializable { 
    public static final String tableName = "TABLE_1";//this variable you can reference in other portions of your code. Of course you cannot change it. 
    ............... 
} 
+0

a parfaitement fonctionné. Merci. :) – dgupta3091

0

Si vous souhaitez sélectionner des données à partir des tables différentes,

vous pouvez utiliser:

@Subselect("")

au lieu de:

@Table(name = "tableName").

Questions connexes