2010-03-15 11 views
11

Estoy usando JPA y necesito hacer que "tableName" sea una variable.En @Table (name = "tableName") - make "tableName" una variable en JPA

En una base de datos, tengo muchas tablas y mi código necesita acceder a la tabla donde lo especifico para leer.

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

¿Alguna idea?

+0

* "mi código necesita acceder a la tabla donde lo especifico para leer." * ¿Podría aclarar qué está tratando de hacer? –

+0

Por favor vea mi comentario para responder 1. Gracias. – zengr

+0

Para reformular: necesito el esquema dinámico. Donde la tabla se crea sobre la marcha. – zengr

Respuesta

4

Puede hacer algo como esto, si esa es su preocupación, supongo. Nunca lo intenté, es solo una conjetura salvaje. Pero esa es la práctica habitual: lo sigo para las consultas con nombre; sí, eso es completamente diferente.

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

Pero no veo por qué alguien haría eso. ¿Podrías decirnos qué estás haciendo? ¿Por qué tiene pocas tablas exactamente la misma definición?

[Editado]

me trataron su solución. No funcionó , dice: El valor para el atributo de anotación Table.name debe ser ser una expresión constante.

Entonces, ¿no es lo suficientemente claro? Quiero decir que no puedes hacer eso. Y creo que es bastante lógico. Si desea que Hibernate genere su esquema, puede definir todas las entidades que desee, en el esquema y con las relaciones apropiadas.

+1

Bien, esta es mi situación. Tengo una clase JPA llamada "Base de datos" y puedo tener muchas tablas (dependiendo de los datos de entrada del lado del cliente).Por lo tanto, por ahora, la clase de base de datos solo crea UNA tabla cuando se ejecuta (@Table = name). Pero necesito esta clase para crear tablas en tiempo de ejecución con la variable TableName proveniente de otro lugar. Intenté tu solución. No funcionó, dice: El valor para el atributo de anotación Table.name debe ser una expresión constante. – zengr

+0

Para reformular: necesito el esquema dinámico. Donde la tabla se crea sobre la marcha. – zengr

+0

@zengr: revisa mi apéndice de la publicación. –

2

No es posible especificar el nombre de la tabla en tiempo de ejecución, simplemente no es así como funciona JPA (y aún no estoy seguro de obtener su requisito). Puede mapear diferentes entidades en su conjunto de tablas y ejecutar varias consultas o compilarlas dinámicamente (tal vez usando la API Criteria) dependiendo de la entrada del lado del cliente o use algo más que JPA (como iBATIS).

+0

¿Es esta una posible solución? http://java.dzone.com/articles/hibernate-dynamic-table-routin – zengr

+1

@zengr No puedo responder esta pregunta, todavía no entiendo lo que estás tratando de hacer. Tablas dinámicas? Diferentes esquemas? Esto no está claro. –

+0

@zengr Parece que este enlace hace lo que quiere (aunque puede ofuscar completamente las cosas para un ingeniero de mantenimiento). Hibernate Shards también es una opción interesante. Pero cuando vayas en esta dirección, pregúntate muchas veces "¿Realmente necesitas esto?". ¿Es realmente su proyecto realmente complejo para garantizar esta solución compleja? –

3

Si solo quiere hacer referencia/leer el nombre de la tabla, es posible como en el siguiente código. Si quieres cambiar, no es posible, como dijo Pascal.

@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

funcionó perfectamente. Gracias. :) – dgupta3091

0

Si desea seleccionar los datos de diferentes tablas,

continuación, puede utilizar:

@Subselect("")

en lugar de:

@Table(name = "tableName").

Cuestiones relacionadas