web-dev-qa-db-fra.com

Comment ajouter dynamiquement Entity dans Hibernate?

Je suis un développeur Java. J'utilise spring 4.0.1 et hibernate 4.2.21 . J'ai un cours comme suit:

@Entity
@Inheritance(...)
public abstract class Feature{
   @Id
   @GeneratedValue
   protected Long id;

   ...

}

Maintenant, j'ai quelques cours comme suit:

Label.Java class:

@Entity
public class Label extends Feature{
   protected String str;

   ...
}

Classe Point.Java:

@Entity
public class Point extends Feature{
   protected Integer intg;

   ...
}

J'ai plus de 20 classes d'entités qui vont de la classe Feature. Existe-t-il un moyen d'ajouter dynamiquement ces classes (telles que Label et Point) au projet sans écrire de code matériel?

update :

Par exemple, Hibernate récupère les données d'une base de données puis, en fonction de ces données, crée des modèles.

  1. C'est possible?
  2. Comment fais-je?
16
Morteza Malvandi

Je pense que ce n'est pas une bonne conception de base de données qui doit être modifiée de manière dynamique. Cela semble verbeux et pas cohérent. Observez à nouveau votre domaine et essayez de concevoir des relations d'entité appropriées qui ne seraient pas modifiées au fil du temps. 

6
Shafin Mahmud

Je pense que vous voulez générer votre classe d'entité au moment de l'exécution au lieu de cela, vous devez écrire votre fichier Java et le compiler, etc. Si cela est nécessaire, vous pouvez utiliser un générateur de code octet tel que javassist pour générer et annoter votre fichier de classe au moment de l'exécution. Ensuite, vous pouvez le conserver sur votre table à l'aide de JPA, Hibernate et de tout autre framework ORM. J'écris une base de générateur de classe sur un fichier xml. Dans les prochains jours, elle sera terminée et je vous donnerai un lien vers mon github. Vous pouvez donc l'utiliser pour générer vos classes d'entité. bonne journée:)

5
Joshua Bloch

Vous pouvez essayer de collecter les données nécessaires à la création du modèle et générer un fichier hibernate hbm.xml pour chaque entité (format xml et facile à générer avec Java après lecture des données requises, décrites dans la mise à jour).

Après cela, vous pouvez créer par programme un objet de configuration hibernate après ceci http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/session-configuration.html#configuration-programmatic

Je pense qu'avec cette approche, vous pouvez réaliser ce que vous voulez si je comprends bien votre question.

5

Si je comprends bien, vous devez développer un outil et collecter les noms de table ayant une relation un à un avec la table Feature.

Ma suggestion est comme ça (testé avec Oracle):

1) Dans votre base de données, obtenez les métadonnées des tables qui référencent votre table de fonctions. Ci-dessous imprimera vos tables Label, Point, etc. ayant une relation de clé étrangère avec votre table.
Si vous souhaitez uniquement générer un sous-ensemble (les tables non pertinentes peuvent également avoir cette relation), vous pouvez par exemple mettre un nom de colonne commun clé étrangère et filtrer les tables non liées à l'aide d'un tel marquage.

Connection connection = jdbcTemplate.getDataSource().getConnection();
DatabaseMetaData metaData = connection.getMetaData();

ResultSet exportedKeys = metaData.getExportedKeys(connection.getCatalog(), "<your_schema_name>", "FEATURE");
while (exportedKeys.next()){
    String fkTableName = exportedKeys.getString("FKTABLE_NAME");
    String fkColumnName = exportedKeys.getString("FKCOLUMN_NAME");  
    System.out.println("[fkTableName:" + fkTableName + "], [fkColumnName" + fkColumnName + "]");
}
exportedKeys.close();


2) Pour les tableaux que vous avez rassemblés ci-dessus, obtenez pour chaque tableau de notre préoccupation des métadonnées pour les types et les colonnes.

ResultSet columns = metaData.getColumns(connection.getCatalog(), "<your_schema_name>", "<your_table_name>", null);
while (columns.next()){
    String columnName = columns.getString("COLUMN_NAME");
    String typeName = columns.getString("TYPE_NAME");
    System.out.println("[columnName:" + columnName + "], [typeName" + typeName + "]");
}
columns.close();


3) Selon le résultat de 2, générez vos classes Java. Avec des champs, des setters, des annotations, etc. Copiez-les ensuite dans votre répertoire source. Tu connais la suite :) 

J'espère que c'est utile.

3
hsnkhrmn

Ne te répète pas.

Si vous avez vraiment besoin de ces classes, utilisez un IDE (comme Eclipse) pour les générer. Vous pouvez également utiliser les génériques et l'héritage pour créer une seule classe capable de stocker des chaînes ainsi que des entiers.

Mais si vous n'avez pas réellement besoin classes, générez du SQL (pas de JPQL ni de HQL) et stockez les données dans Java.util.Map et des structures de données similaires.

Les cours sont bons pour:

  • type de sécurité
  • combinant logique (méthodes) avec données (champs)
  • décrire les relations

Dans votre cas, vous pourriez n'avoir besoin que de:

  • stocker des données structurées au moment de l'exécution.
2
slartidan

Je pense que vous pouvez utiliser Hibernate Reverse Engineering pour générer Entity pour toutes les tables de base de données. S'il vous plaît se référer this Link. Cela expliquera étape par étape le processus pour générer une entité à partir d'une base de données en utilisant le reverse engineering hibernate.

2
ypp

Je pense que vous pouvez le faire avec Eclipse, mais les classes ont dû être modifiées plus ou moins pour préserver la hiérarchie des héritages.

  • Cliquez avec le bouton droit sur le nom du projet et sélectionnez Propriétés
  • Utiliser les facettes du projet si les facettes du projet ne sont pas activées

 enter image description here

  • Cliquez sur leJPAs'il n'est pas sélectionné, puis surOKpour fermer la fenêtre des propriétés du projet.

  • Après avoir activé JPA dans les propriétés du projet, cliquez à nouveau avec le bouton droit de la souris sur le nom du projet Eclipse. Un nouvel élément du menu contextuel JPA tools apparaît. Choose Générer des entités à partir de tables

 enter image description here

Sélectionnez une connexion de base de données pour permettre à Eclipse d'obtenir les tables utilisées pour générer la classe . 

Voici comment configurer la base de données dans Eclipse

  • Il est préférable de créer les entités dans un projet fictif à l'aide de la méthode ci-dessus et de copier les classes d'entité dans le projet réel.

  • Le refactoring de classe d'Eclipse peut être utilisé pour préserver la hiérarchie d'héritage souhaitée.

J'espère que cela t'aides.

1
tharindu_DG