2015-11-25 8 views
16

Ich bin ein Java-Entwickler. Ich verwende spring 4.0.1 und hibernate 4.2.21. Ich habe eine Klasse wie folgt:Wie Entität in Hibernate dynamisch hinzufügen?

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

    ... 

} 

Jetzt habe ich einige viele Klasse wie folgt:

Label.java Klasse:

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

    ... 
} 

Point.java Klasse:

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

    ... 
} 

Ich habe mo re als 20 Entity-Klasse, die von Feature Klasse erstreckt. Gibt es eine Möglichkeit, dynamisch diese Klassen (wie Label und Point) zu dem Projekt hinzuzufügen, ohne harten Code zu schreiben?

Update:

Zum Beispiel Hibernate Daten aus einer Datenbank erhalten und dann nach diesen Daten, Modelle erstellen.

  1. Ist es möglich?
  2. Wie mache ich?
+2

Versuchen Sie, Ihr Problem besser zu beschreiben? Wenn ich verstanden habe, was Sie sagen, können Sie alle Entitäten automatisch generieren mit jpa-Tools in Ihrer ide – Skizzo

+0

Was meinen Sie mit 'Es gibt eine Möglichkeit, diese Klassen (wie Label und Point) dynamisch hinzuzufügen, ohne hart zu schreiben Code? ' Ich denke, jetzt sollten Sie vertraut sein, wie man Frage stellt! – SyntaX

+1

Ich habe mehr als 20 Entity, die Form "Feature" erweitert. Ich möchte, wenn das Projekt bereitgestellt wird, alle diese Klassen automatisch generieren. –

Antwort

5

Ich denke, Sie wollen Ihre Entity-Klasse zur Laufzeit generieren, anstatt dass Sie Ihre Java-Datei schreiben und kompilieren müssen und so weiter. Wenn dies Ihre Anforderung ist, können Sie einen Bytecode-Generator wie javassist verwenden, um Ihre Klassendatei zur Laufzeit zu generieren und zu kommentieren. Dann können Sie es mit JPA, Hibernate und jedem anderen ORM-Framework an Ihrer Tabelle beibehalten. Ich schreibe eine Klasse Generator-Basis auf XML-Datei. In Zukunft wird es fertig sein und ich werde Ihnen einen Link zu meinem GitHub geben. Sie können damit Ihre Entitätsklassen generieren. habe einen schönen Tag :)

+0

Hallo, ist Ihr Projekt beendet? – bilak

+0

Haben Sie Ihren Generator fertiggestellt? Funktioniert es wie erwartet? – mrgenco

1

Ich denke, Sie könnten dies mit Eclipse tun, aber die Klassen mussten mehr oder weniger geändert werden, um die Vererbungshierarchie zu erhalten.

  • Righ klicken Sie auf den Projektnamen und wählen Sie Eigenschaften
  • Verwenden Projekt Facetten wenn Projekt nicht

enter image description here

  • Klicken Sie auf die JPA nicht, wenn es aktiviert Facetten ausgewählt, dann klicken Sie auf OK, um das Projekteigenschaftenfenster zu schließen.

  • Nachdem Sie JPA in den Projekteigenschaften aktiviert haben, klicken Sie nun mit der rechten Maustaste auf den Projektnamensnamen erneut. Es sollte ein neuer Kontextmenüeintrag JPA-Werkzeuge angezeigt werden.Wählen Sie generieren Entities aus Tabellen

enter image description here

Wählen Sie eine Datenbankverbindung Eclipse lassen die Tabellen erhalten verwendet erzeugten Klasse aus.

Hier ist how to setup db in eclipse

  • Es ist besser, die Einheiten in einem Dummy-Projekt zu erstellen, das obige Verfahren verwenden und die Entity-Klassen in die reale Projekt kopieren.

  • Eclipse Class Refactoring kann verwendet werden, um die gewünschte Vererbungshierarchie beizubehalten.

Hoffe das hilft.

2

Ich denke, Sie können Hibernate Reverse Engineering verwenden, um Entity für alle Datenbanktabellen zu generieren. Bitte beziehen Sie sich auf this Link. Das wird Schritt-für-Schritt-Prozess erläutert, um eine Entität aus der Datenbank unter Verwendung des Hibernate Reverse Engineering zu generieren.

6

Ich denke, es ist kein gutes Datenbank-Design, das dynamisch geändert werden muss. Es klingt ausführlich und nicht konsistent. Beobachten Sie Ihre Domäne erneut und versuchen Sie, eine richtige Entitätsbeziehung zu erstellen, die nicht über die Laufzeit geändert werden würde.

3

Wie ich verstehe, müssen Sie ein Werkzeug entwickeln, sammelt Tabellennamen, die eine 1: 1-Beziehung mit Feature Tabelle haben.

Mein Vorschlag ist, dass wie (getestet mit Oracle):

1) Aus Ihrer DB, erhalten Tabellen-Metadaten, die Ihre Feature-Tabelle nimmt Bezug. Im Folgenden werden die Tabellen "Label", "Point" usw. gedruckt, die eine Fremdschlüsselbeziehung zu Ihrer Tabelle haben.
Wenn Sie nur eine Teilmenge generieren möchten (irrelevante Tabellen könnten diese Beziehung ebenfalls haben), können Sie einen gemeinsamen Fremdschlüsselspaltennamen eingeben und nicht verwandte Tabellen mit Hilfe einer solchen Markierung herausfiltern.

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) Für die Tabellen gesammelt Sie oben, für jede Tabelle unserer Sorge, die Metadaten der Tabelle für die Typen und Spalten erhalten.

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) von 2 generieren Klassen Java führen Laut. Mit Feldern, Getter-Settern, Annotationen usw. Kopieren Sie diese dann in Ihr Quellverzeichnis. Sie kennen den Rest :)

Hoffe, das ist hilfreich.

+0

Das ist eine gute Idee, aber im dritten Schritt reicht die Generierung von Java-Klassen nicht aus, um Objekte zur Laufzeit zu persistieren. Sie müssen generierte Quelldateien kompilieren, um sie zu verwenden. – mrgenco

2

Wiederhole dich nicht.

Wenn Sie diese Klassen wirklich benötigen, verwenden Sie eine IDE (wie Eclipse), um die Klassen zu generieren. Oder verwenden Sie Generika und Vererbung, um nur eine Klasse zu erstellen, die sowohl Strings als auch Integer speichern kann.

Aber wenn Sie nicht tatsächlich brauchen Klassen, generieren SQL (nicht JPQL noch HQL) und die Daten in java.util.Map und ähnlichen Datenstrukturen zu speichern.

Klassen sind gut für:

  • Typsicherheit
  • Kombination Logik (Methoden) mit Daten (Felder)
  • beschreiben Beziehungen

In Ihrem Fall könnten Sie brauchen nur:

  • strukturierte Daten speichern bei Laufzeit.
5

Sie können versuchen, die benötigten Daten zu sammeln, um das Modell zu bauen und eine Hibernate hbm.xml Datei für jede Entität zu erzeugen (ist XML-Format und einfach mit Java zu erzeugen, nachdem das Lesen der Daten benötigt, wie Sie in Ihrem Update beschreiben)

Danach können Sie diese wollen http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/session-configuration.html#configuration-programmatic

ich mit diesem Ansatz Denken können Sie erreichen, was Sie programmatisch ein Hibernate-Konfigurationsobjekt folgenden erstellen, wenn ich gut verstehe Ihre Frage.

Verwandte Themen