2009-05-13 5 views
14

Sto lavorando a un'applicazione Web che utilizza Spring MVC 2.5 e Hibernate.Hibernate + Spring utilizzando più origini dati?

Uno dei requisiti dell'applicazione è che deve essere in grado di esportare alcuni oggetti in un database esterno. Immagino di poter usare il mio livello dati esistente e di salvare gli oggetti sulla fonte esterna.

Sono nuovo per Spring e Hibernate, e credo che mi stia chiedendo come dovrei avvicinarmi a questo. In questo momento tutto è automaticamente cablato attraverso le annotazioni. Sto indovinando dovrò creare un nuovo bean dataSource, e un nuovo sessionFactory, e un transactionManager ... forse ... ma ...

  1. voglio solo la connessione ai dati esterni fonte di essere disponibile quando l'utente è specificamente "esportatore".

  2. Il meccanismo di attivazione si sta per mettere in mezzo? Come posso dire a Spring di iniettare il sessionFactory appropriato quando istanzio un DAO per il mio processo di esportazione? (Sto effettuando l'autowiring tramite i costruttori) Devo creare in modo programmatico la mia factory di sessione (etc) e quindi istanziare manualmente il mio DAO? In tal caso, questo "sostituirà" l'annotazione autowire?

Credo che non ho bisogno di risposte alle domande di cui sopra in particolare se qualcuno può solo io passo attraverso il processo di base di ottenere qualcosa di simile al lavoro. Grazie!

+0

Questa domanda è terribilmente simile a questa: http://stackoverflow.com/questions/281247/nhibernate-one-base-class-several-mappings –

risposta

8

La configurazione di più origini dati e factory di sessione nel proprio contesto di primavera non sarà di per sé un problema, ma rende meno attraente l'autowiring.

è possibile utilizzare il @Qualifier annotazioni a dire l'autowiring quale scegliere, ma io suggerirei di non usare autowiring, e invece l'iniezione in modo esplicito il corretto fabbrica fonte dei dati e sessione utilizzando <property> o <constructor-arg>.

Il gestore transazioni potrebbe essere condiviso tra entrambe le origini dati, se entrambe le origini dati sono gestite dal server delle app, ma sembra che avere l'integrità transazionale su entrambe le origini dati non sia un requisito per te e che abbia transazioni separate per ogni fonte di dati sarebbe sufficiente.

+0

come è possibile condividere un gestore delle transazioni tra le due fonti di dati? Non vedo un setter che prende una lista di SessionFactory o simili. –

+0

@NieldeWet: le transazioni con più origini dati sono di tipo diverso. Le transazioni distribuite sono difficili. Per questo, hai bisogno della piena potenza delle implementazioni JTA in JavaEE, e quindi usi Spring's JtaTransactionManager per integrarlo con la tua app. – skaffman

24

Spring per fortuna ha già una soluzione per questo: AbstractRoutingDataSource. Fondamentalmente agisce come una facciata per più origini dati e consente di suddividerla e implementare la logica necessaria per decidere quale DataSource deve essere utilizzato. Alcuni dettagli sono qui:

http://blog.springsource.com/2007/01/23/dynamic-datasource-routing/

In questo modo la logica di ricerca DataSource per essere gestito in esattamente un posto. Non è necessario regolare il livello DAO e SessionFactory, tranne che è necessario iniettare la sottoclasse di AbstractRoutingDataSource in Hibernate SessionFactory.

+0

È questo l'approccio giusto se c'è sempre un'origine dati attiva in fase di esecuzione?Nel mio caso stiamo supportando 2 dbms per client diversi ma solo 1 server ciascuno –

+1

Probabilmente no, no. Dovresti configurare l'URL JDBC tramite Spring PropertyPlaceholderConfigurer. Si potrebbe avere letto da un file di proprietà o anche una variabile di ambiente. –

+0

Questo è praticamente quello che ho fatto alla fine. Ho specificato una proprietà che è stata utilizzata per selezionare quale bean è stato utilizzato come origine dati. L'ho postato [qui] (http://stackoverflow.com/questions/23915154/using-sqlserverconnectionpooldatasource-in-spring/23993098#23993098) –