Notre base de données a actuellement 2 schémas, un pour la production, un pour les tests, des tables identiques mais des données différentes.
Côté serveur, nous utilisons RoutingDatasource pour gérer les données. Chaque requête a un paramètre pour savoir à quelle base de données accéder, comme "prod" ou "test". Le paramètre est ensuite stocké dans ThreadLocal. Notre RoutingDatasource va récupérer ce paramètre, dépendre de la valeur et retourner la bonne source de données. Nous n'avons donc besoin que d'une seule entité de mappage et d'un seul CrudRepository pour la même table dans les deux schémas.
Mais pour une raison (stupide), on nous a demandé de fusionner les deux schémas en un seul, avec un préfixe devant chaque table, comme PROD_TABLE1, TEST_TABLE1, PROD_TABLE2, TEST_TABLE2, etc.
Je voudrais donc savoir comment conserver une seule entité, un seul référentiel pour chaque table avec cette exigence ? Nous ne voulons pas cloner le code, créer trop de classes qui héritent de celles qui existent déjà juste pour les adapter à la deuxième table. @SecondaryTable ne semble pas être ce que nous recherchons.
\===============================
UPDATE 1 :
Je regarde PhysicalNamingStrategy, capable d'ajouter un préfixe au nom de la table. Mais cela n'est exécuté qu'une seule fois lors de l'initialisation de l'EntityManager. Existe-t-il un autre moyen d'ajouter un préfixe au nom de la table à chaque demande ?
\===============================
MISE À JOUR 2 : J'essaie avec quelque chose comme ça :
@Table(name = "##schema##TABLE1")
Puis ajouter un intercepteur Hibernate à notre projet. Lors de la préparation de la déclaration, nous récupérons le paramètre de ThreadLocal, puis nous remplaçons la partie "##schema##" par le préfixe correct. En utilisant cette méthode, tout fonctionne, mais je n'aime pas vraiment cette solution.
Quelqu'un a t-il une meilleure façon de le faire ?