2009-10-02 9 views
6

Sto lavorando su un'applicazione web. Stiamo utilizzando Hibernate come ORM nel nostro progetto. In realtà, la nostra applicazione crea dinamicamente alcune tabelle in base alla selezione dell'utente. L'utente può selezionare il nome della tabella, il nome della colonna e quindi può importare i dati da un file csv. Quindi la mia domanda è: come mappare questa tabella creata dinamicamente con oggetti Hibernate e Java?Come mappare la tabella creata dinamicamente in Hibernate?

risposta

10

Si può fare in modo dinamico, ma è un po 'disordinato:

Avrete bisogno di modificare dinamicamente oggetto di configurazione di Hibernate prima SessionFactory è costruito. Se stai usando Spring, puoi farlo ignorando il metodo postProcessAnnotationConfiguration() di AnnotationSessionFactoryBean; in caso contrario sarà sufficiente farlo utilizzando l'oggetto Configuration prima di richiamare buildSessionFactory() su di esso.

Se è necessario eseguire questa operazione senza il riavvio dell'applicazione, si sta cercando di ricostruire SessionFactory (il che significa che gli utenti dovranno attendere fino a quel punto) o utilizzare un'istanza SessionFactory separata specificatamente dedicata alle proprie classi personalizzate (che è quasi impossibile se le tue classi personalizzate devono fare riferimento alle tue classi built-in).

È possibile accedere ai mapping di classe/tabella tramite configuration.getMappings(). Sarà quindi necessario creare una nuova mappatura tabella tramite Table API e aggiungerla alla configurazione tramite addTable(). La stessa cosa dovrà essere fatta con PersistentClass che rappresenta una mappatura di classe. Se stai utilizzando la stessa classe per rappresentare più entità (ad esempio, associa più tabelle) assicurati di utilizzare nomi di entità univoci per ciascuna. Dovrai farlo (modificare la configurazione) su ogni riavvio dell'app.

2

Quante tabelle vengono create dinamicamente? Le tabelle sono simili e basta cambiare il nome del database?

Ecco una discussione di cambiare il nome della tabella: http://www.experts-exchange.com/Programming/Languages/Java/J2EE/Frameworks/Spring/Q_24237099.html

Se state completamente costruendo una nuova tabella, è possibile utilizzare la vista, e la gente diretti ad una vista?

Perché stai utilizzando Hibernate per questo, invece di creare query in modo dinamico solo in JDBC?

+0

Sono d'accordo, utilizzando Hibernate per questo problema non è corretto. – sbidwai

0

La soluzione di database: è possibile creare una vista e puntarla su una tabella o un'altra (assumendo che la struttura sia identica).

CREATE VIEW HIBERNATE_NAME come SELECT * FROM TABLE_A

o CREATE VIEW HIBERNATE_NAME come SELECT * FROM TABLE_B

Si avrebbe bisogno voi l'applicazione per eseguire SQL nativo (DDL), tuttavia questo dovrebbe essere più semplice di Hibernate hack

Problemi correlati