[Megoldva] Hibernate+Spring több adatbázis

Fórumok

Hello,

Adott a következő:

applicationContext.xml http://pastebin.com/fjjSRdXm
datasource.xml http://pastebin.com/VXY3H9yZ

Szeretném, ha a login képernyőn megadott db-re tudna belépni a user.
A db-k egyformák, egyforma táblák stb.
Erre keresnék valamilyen megoldást.

Van egy CustomHibernateDaoSupport osztály, amiből a Dao-kat származtatom.


package hu.xxx.services;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Component;

@Component
public abstract class CustomHibernateDaoSupport extends HibernateDaoSupport {

@Autowired
public void _SetSessionFactory(SessionFactory factory) {
setSessionFactory(factory);
}

}

De hiába állítom át a hibernate configot menet közben, ettől még a Dao session-je nem fog módosulni.


AnnotationConfiguration ac = new AnnotationConfiguration();

Properties p = new Properties();
p.put( Environment.DIALECT, "org.hibernate.dialect.PostgreSQLDialect" );
p.put( "hibernate.connection.driver_class", "org.postgresql.Driver" );
p.put( "hibernate.connection.url", "jdbc:postgresql://192.168.1.9:5432/db1" );
p.put( "hibernate.connection.username", "user" );
p.put( "hibernate.hbm2ddl.auto","update");
p.put( "hibernate.connection.password", "pass" );
p.put( "hibernate.show_sql", "true" );
ac.setProperties( p );
ac.addAnnotatedClass( HrpUsers.class );
SessionFactory factory = ac.buildSessionFactory();

Szóval, ha lenne valami frappáns megoldás, ne kíméljetek. Köszi!

Hozzászólások

Ha előre adott db listából kell választani, akkor definiáld mindet a configban és tegyél eléjük egy AbstractRoutingDataSource-t, amit beállítasz a sessionFactory-nak. A routolás történhet request paraméter alapján.

Ha a user írja be a db adatait, akkor DelegatingDataSource leszármazottal próbálkoznék, ami a getTargetDataSource() metódusában az adott request-hez való DataSource-ot ad vissza (ő hozza létre a request paraméterek alapján pl.: egy SingleConnectionDataSource-t). A sessionFactory-nak a DelegatingDataSource implementációt állítanám be.

Hi,

Asszem értem a lényeget.

datasource.xml

http://pastebin.com/DfhpNnuM

CustomDelegatingDataSourceImpl

http://pastebin.com/5YRBh9X5

Ebben még sok értelem nincs, csak a működést szerettem volna látni.
A CustomDelegatingDataSourceImpl bean-t aztán ijektálom egy Bo-ba

@Autowired
CustomDelegatingDataSourceImpl datasource;

Ez megoldva:

Szépen létre is jön, de amikor próbálok egy datasource.setUrl(""); hívást, akkor
private hu.xxx.services.CustomDelegatingDataSourceImpl hu.xxx.main.AdminPage.routingDataSource [class=hu.xxx.services.CustomDelegatingDataSourceImpl] <----- field that is not serializable
Olvastam valahol, h alapból singletonként jön létre a bean, gondolom
ez lehet a probléma.

http://pastebin.com/XaDw5sEX


 public SingleConnectionDataSource getTargetDataSource() {
        String password=targetDataSource.getPassword();
        String username=targetDataSource.getUsername();
        String newurl="jdbc:postgresql://192.168.1.9:5432/db1";
        targetDataSource.destroy();
        SingleConnectionDataSource ds=new SingleConnectionDataSource(newurl, username, password, true);
        targetDataSource=ds;
        return targetDataSource;
    }

Létrejön a bean, le tudom kérni a getTargetDataSource()-t, létrehozok újat a fentiek alapján, létre is jön. Azonban a bo-ban kiadott save mégis a "régi" db-be akarja kiírni a rekordot.
Köszi!

És megvan..

datasources.xml (ez megy az applicationContext.xml-be)

http://pastebin.com/93nawn2W
http://pastebin.com/n493m7Ka

A CustomDelegatingDataSourceImpl bean-t már tudom injektálni a Dao osztályomba, majd az authentikáció előtt tudok egy setUrl-t állítani, amivel a megfelelő db-ből authentikál a felhasználó.

Köszi mindenkinek az útmutatást!