2010-03-15 3 views
11

ich JPA verwende und ich brauche die "tablename" eine Variable zu machen.In @Table (name = "tablename") - make "tablename" eine Variable in JPA

In einer Datenbank habe ich viele Tabellen, und mein Code muss auf die Tabelle zuzugreifen, wo ich es angeben, zu lesen.

@Entity 
@Table(name = "tableName") 
public class Database implements Serializable {...............} 

Irgendwelche Ideen?

+0

* „mein Code muss auf die Tabelle zuzugreifen, wo ich es angeben, zu lesen.“ * Könnten Sie bitte klären, was Sie zu tun versuchen. –

+0

Bitte beachten Sie meinen Kommentar zu beantworten 1. Danke. – zengr

+0

Umzuformulieren: Ich brauche ein dynamisches Schema. Wo die Tabelle im laufenden Betrieb erstellt wird. – zengr

Antwort

4

Sie können so etwas tun, wenn das Ihre Sorge ist, denke ich. Niemals versucht, es ist nur eine wilde Schätzung. Aber das ist die übliche Praxis - ich folge Named Queries; Ja, das ist eine ganz andere Sache.

@Entity 
@Table(name = Database.tableName) 
public class Database implements Serializable { 
    public static final String tableName = "TABLE_1"; 
    ............... 
} 

Aber ich sehe nicht, warum jemand das tun würde. Können Sie uns sagen, was Sie vorhaben? Warum haben Sie wenige Tabellen genau die gleiche Definition?

[Edited]

versuchte ich Ihre Lösung. Es hat nicht funktioniert, heißt es: Der Wert für Annotationsattribut Table.name muss ein konstanter Ausdruck sein.

Also, ist das nicht klar genug? Ich meine, das kannst du nicht tun. Und ich glaube, es ist ziemlich logisch. Wenn Sie möchten, dass Hibernate Ihr Schema generiert, können Sie alle gewünschten Entitäten im Schema und mit den entsprechenden Beziehungen definieren.

+1

Ok, das ist mein Szenario. Ich habe eine JPA-Klasse namens "Database" und ich kann viele Tabellen haben (abhängig von den Eingabedaten von der Client-Seite).Vorerst erstellt die Datenbankklasse nur EINE Tabelle, wenn sie ausgeführt wird (@Table = name). Aber ich brauche diese Klasse, um Tabellen zur Laufzeit zu erstellen, wobei die Variable TableName von woanders kommt. Ich habe deine Lösung versucht. Es hat nicht funktioniert, es heißt: Der Wert für das Annotationsattribut Table.name muss ein konstanter Ausdruck sein. – zengr

+0

Umzuformulieren: Ich brauche ein dynamisches Schema. Wo die Tabelle im laufenden Betrieb erstellt wird. – zengr

+0

@zengr: Überprüfen Sie mein Addendum zum Beitrag. –

2

die Tabellennamen zur Laufzeit angeben ist nicht möglich, das ist einfach nicht wie JPA funktioniert (und ich bin immer noch nicht sicher, ob Ihre Anforderung zu bekommen). Entweder Karte verschiedene Einheiten auf dem Satz von Tabellen und verschiedene Abfragen ausführen oder bauen sie dynamisch (vielleicht die Kriterien API) in Abhängigkeit von der Eingabe von der Client-Seite oder Verwendung etwas anderes als JPA (wie iBATIS).

+0

Ist das eine mögliche Problemumgehung? http://java.dzone.com/articles/hibernate-dynamic-table-routin – zengr

+1

@zengr Ich kann diese Frage nicht beantworten, ich verstehe immer noch nicht, was Sie versuchen zu tun. Dynamische Tabellen? Andere Schemas? Das ist nicht klar. –

+0

@zengr Es sieht so aus, als würde dieser Link das tun, was Sie wollen (obwohl es die Dinge für einen Wartungsingenieur völlig verschleiern kann). Hibernate Shards ist auch eine interessante Option. Aber wenn du in diese Richtung gehst, frage dich viele Male: "Brauchst du das wirklich?". Ist Ihr Projekt wirklich komplex, um diese komplexe Lösung zu rechtfertigen? –

3

Wenn Sie nur Referenz wollen/Lese der Tabellennamen, ist es möglich, wie in dem folgenden Code. Wenn Sie sich ändern wollen, ist es nicht möglich, wie Pascal sagte.

@Entity 
@Table(name = Database.tableName) 
public class Database implements Serializable { 
    public static final String tableName = "TABLE_1";//this variable you can reference in other portions of your code. Of course you cannot change it. 
    ............... 
} 
+0

hat perfekt funktioniert. Vielen Dank. :) – dgupta3091

0

Wenn Sie Daten auswählen möchten aus verschiedenen Tabellen,

dann können Sie verwenden:

@Subselect("")

statt:

@Table(name = "tableName").

Verwandte Themen