Changer le nom de la table d'une entité à l'exécution?
Il y a ce tableau qui est généré sur une base mensuelle. Fondamentalement, la structure de la table de tous les mensuel tables est le même.
Car il serait beaucoup de travail à la carte de la même entité, avec juste un autre nom de table,
Est-il possible de changer le nom de la table d'une entité comme suit l'exécution, car ils ont la même structure de table, après tout?
@Entity
@Table(name="FOO_JAN2010") //any other ways to generate this dynamically?
public class FooJan2010Table { //if we can dynamically set the table name this can be simply named FooTable
...
}
Si non, comment pouvez-vous suggérer?
source d'informationauteur Joopiter
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas vraiment possible, du moins pas avec la norme JPA (ce qui ne veut pas dire que je l'ai fait avec non standard JPA) comme mentionné dans des questions telles que:
Pour résumer, JPA n'offre pas un moyen de "changer" une entité donnée, déjà initialisé unité de persistance (et les pré-compilé CRUD des requêtes, le pré-compilé des requêtes nommées, etc).
Encore, puisque vous êtes en utilisant Hibernate, peut-être avoir un coup d'oeil à http://www.hibernate.org/171.html pour avoir une idée de ce qui serait possible en utilisant l'API Hibernate Core.
Une autre option je pense, serait d'utiliser une base de données synonyme /alias:
FOO
serait un alias pourFOO_JAN2010
jusqu'à ce que... à vous de modifier l'alias de point surFOO_FEB2010
. Je n'ai jamais testé, je ne sais pas si cela va répondre à vos besoins. Mais c'est une autre idée.Vous peut probablement le faire à l'aide de Stratégies De Noms si vous utiliser Hibernate comme fournisseur JPA. Voir ma réponse à cette question précédente de référence.
Vous devriez être en mesure de concevoir votre stratégie de nommage pour retourner les noms de table dans une manière dynamique.
La question de savoir si vous devrait le faire de cette façon est complètement différent, cependant.
Aussi, merci Pascal de me le rappeler, cela ne fonctionnera que si l'EntityManagerFactory est recréé une fois par mois (il y a beaucoup de façons de le faire, le redémarrage de la webapp étant le plus simple)
Je ne peux pas imaginer un bon moyen de cette carte. Si c'est un héritage de la base de données, vous aurez un moment difficile de l'utiliser JPA pour y accéder.
Si, toutefois, la disposition de base de données est sous votre contrôle, alors je vais le changer. Le fait d'avoir plusieurs tables avec la même mise en page est généralement de mauvaise conception. Vous pourriez obtenir le même résultat en n'ayant qu'un seul tableau avec des colonnes supplémentaires pour l'année et le mois. N'oubliez pas de mettre un index sur les deux colonnes.
Je ne pouvais pas comprendre non plus, avait une exigence similaire.
Depuis ma table, le nom a été changé relativement peu fréquents (tous les jours) , j'ai fini par la définition d'un DB alias "active" en SGBDR (je suis de l'utilisation de DB2) et référencé le nom d'alias de table dans l'annotation @Table.
Je suis pleinement conscient que ce n'est pas strictement ce que l'OP a demandé, mais pensé que je voudrais partager l'expérience.