Hallo Ihr!
Ich habe mir für die Persistenzschicht eine Lib programmiert, die mittels Hibernate auf eine im Tomcat hinterlegte Datasource zugreift. Mehrere Web-Apps können nun diese Bibliothek nutzen. Nun möchte ich die Bibliothek auch von einer einfachen Java-Anwendung aus nutzen können. Dabei erfolgt die DB-Verbindung nicht über die Datasource. In dem Fall müsste ich wohl in der Hibernate-Konfiguration wieder ganz klassisch den JDBC-Pfad, Benutzer und Kennwort hinterlegen. Weil meine Session-Factory ein Singleton ist, kann ich das aber nicht von außen steuern. Ich dachte daran, mir für diesen Zweck eine zweite Session-Factory zu schreiben. Der Nachteil ist dann aber viel redundanter Code und auch fast identische Konfigurationsdateien. Meine Frage ist nun, ob es da auch eine elegantere Lösung gibt.
Hier meine Session-Factory:
Hier meine Konfiguration (mit JNDI-Datasource):
Gruß, Titus
Ich habe mir für die Persistenzschicht eine Lib programmiert, die mittels Hibernate auf eine im Tomcat hinterlegte Datasource zugreift. Mehrere Web-Apps können nun diese Bibliothek nutzen. Nun möchte ich die Bibliothek auch von einer einfachen Java-Anwendung aus nutzen können. Dabei erfolgt die DB-Verbindung nicht über die Datasource. In dem Fall müsste ich wohl in der Hibernate-Konfiguration wieder ganz klassisch den JDBC-Pfad, Benutzer und Kennwort hinterlegen. Weil meine Session-Factory ein Singleton ist, kann ich das aber nicht von außen steuern. Ich dachte daran, mir für diesen Zweck eine zweite Session-Factory zu schreiben. Der Nachteil ist dann aber viel redundanter Code und auch fast identische Konfigurationsdateien. Meine Frage ist nun, ob es da auch eine elegantere Lösung gibt.
Hier meine Session-Factory:
Code:
public class InitSessionFactory {
private static org.hibernate.SessionFactory sessionFactory;
private InitSessionFactory() {
}
static {
final AnnotationConfiguration cfg = new AnnotationConfiguration();
cfg.configure("/hibernate.cfg.xml");
String sessionFactoryJndiName = cfg.getProperty(Environment.SESSION_FACTORY_NAME);
try {
if (sessionFactoryJndiName != null) {
cfg.buildSessionFactory();
sessionFactory = (SessionFactory) (new InitialContext()).lookup(sessionFactoryJndiName);
} else {
sessionFactory = cfg.buildSessionFactory();
}
} catch (NamingException e) {
throw new HibernateException("Could not configure Hibernate configuration", e);
}
}
public static SessionFactory getInstance() {
return sessionFactory;
}
}
Hier meine Konfiguration (mit JNDI-Datasource):
Code:
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLMyISAMDialect</property>
<property name="hibernate.connection.datasource">java:comp/env/jdbc/LalalaDB</property>
(Hier wäre wahlweise der JDBC-Zugriff nötig)
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="hibernate.default_batch_fetch_size">4</property>
<property name="hibernate.hbm2ddl.auto">vaildate</property>
<property name="hibernate.show_sql">false</property>
<property name="hibernate.format_sql">true</property>
...
</session-factory>
</hibernate-configuration>
Gruß, Titus