2010-09-07 5 views
9

J'ai un schéma de base de données existant que j'essaie d'ORM avec les annotations JPA/Hibernate. Le schéma est conçu pour permettre aux clients d'associer des informations supplémentaires à chaque ligne d'une table. Plutôt que d'utiliser un modèle de valeur-clé , la solution existante détermine le nombre requis de colonnes dynamiques au moment de l'installation et modifie la table en pour ajouter des colonnes supplémentaires pour les champs dynamiques. En effet, chaque table a un ensemble de colonnes connues et fixes et un groupe de colonnes dynamiques.JPA/Hibernate mappage des colonnes dynamiques en tant que Liste d'objets

|table:X| 
|id|known1|known2|dynamic1|dynamic2|..|dynamicx| 

une table de paramètres indique quelles tables ont des champs dynamiques supplémentaires

|table:parameter| 
|table|column|meta| 
|x|dynamic1|| 
|x|dynamic2|| 
|x|dynamicx|| 
|y|dynamic15|| 

Dans la modélisation JPA cela, il est facile de créer une définition pour les colonnes fixes connues sur chaque table.

@Entity 
@Table(name="x") 
public class X 
{ 
    @Id 
    private Long id = null; 

    @Column(name="known1") 
    private Long known1 = null; 
} 

je prévois de modéliser la table des paramètres en tant que classe, et permettre à chacun de mes cours d'avoir une liste de paramètres. Je ne suis pas sûr de savoir comment procéder pour mapper cet objet List afin que les détails soient écrits dans la même table. Je crois que je peux utiliser une stratégie de dénomination personnalisée pour déterminer correctement le nom de la colonne pour le champ dynamique. Est-ce que ce type de cartographie est possible?

+1

J'espère que vous êtes en mesure de changer la base de données ... cela ressemble à un schéma qui a besoin d'une normalisation. – Zoidberg

+0

pour cette question supposons que je ne peux pas. Je pense que je suis proche de frapper le mur de briques. – emeraldjava

Répondre

1

Je pense que vous aurez besoin d'utiliser un nativeQuery pour obtenir ces données dynamiques en utilisant jpa.

+0

+1: Je pense que JPA n'a pas été conçu pour ce genre de besoin, et si vous parvenez à le faire, ce sera à un coût très élevé (et des hacks sales). Utilisez simplement les requêtes natives et 'ResultTransformer's autant que possible, c'est tout ce que Hibernate peut fournir ici. – Vincent

+0

Ceci ne fournit pas de réponse à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire sous son article. – Chaos

+0

@Chaos Ce n'est pas une critique, à mon humble avis, c'est la meilleure façon de résoudre ce problème, c'est-à-dire d'interroger une liste de colonnes dynamiques à partir d'une table. – AmanicA

0

Dans Hibernate c'est possible, S'il vous plaît voir l'article ci-dessous. Cependant, c'est une vieille approche (2007), je me suis cassé la tête pour l'implémenter en utilisant JPA. pas réussi jusqu'à présent

http://www.infoq.com/articles/hibernate-custom-fields

Un autre fil de discussion dans ce sujet est

https://www.java.net//node/666078

+1

Les réponses aux liens uniquement sont fortement déconseillées en raison de la disparition éventuelle des liens. –