Spring und Hbernate konfigurieren bzw. verschalten

Status
Nicht offen für weitere Antworten.

deamon

Bekanntes Mitglied
Hallo,

in Anlehnung an das Beispiel des Buches "Spring im Einsatz" verwende ich die Hibernate-Integration von Spring. Dazu verwende ich verkürzt folgende Bean-Konfiguration:

Code:
<beans>

	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
         
	</bean>

  <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    
    
  </bean>
  
  <bean id="pageDao" class="ein.paket.PageDaoHibernate">
    <property name="sessionFactory" ref="sessionFactory" />
  </bean>

</beans>

Die Klasse PageDaoHibernate sieht so aus:
Code:
public class PageDaoHibernate extends HibernateDaoSupport implements PageDao {

  public void saveOrUpdate(Page page) {
    getHibernateTemplate().saveOrUpdate(page);
  }

}

Laut Buch und API-Doku erwartet die Methode setSessionFactory(SessionFactory sessionFactory) der Klasse HibernateDaoSupport ein Objekt vom Typ org.hibernate.SessionFactory, aber die SessionFactory in der obigen Konfiguration ist vom Typ LocalSessionFactoryBean, die aus einer anderen Vererbungshierarchie stammt und nichts mit der SessionFactory von Hibernate zu tun hat. Die SessionFactory von Spring ist aber eine FactoryFactory und kann eine Hibernate-SessionFactory erzeugen. Bloß, wie verschalte ich das und warum steht davon nichts im Buch (und auch nicht in anderen Beispielen)? Und warum gibt es bei der Ausführung zwar eine NullPointerException aber keinen Fehler wegen falschen Datentypen?
 

byte

Top Contributor
FactoryBeans in Spring sind nicht wie normale Beans. Jede FactoryBean hat eine Methode getObject(). Wenn Du eine FactoryBean in der Spring Konfiguration referenzierst, dann wird nicht die FactoryBean selbst übergeben, sondern es wird das Objekt referenziert, das FactoryBean#getObject() liefert.
In Deinem Fall liefert LocalSessionFactoryBean#getObject() ein Objekt vom Typ org.hibernate.SessionFactory. Daher kannst Du eine LocalSessionFactoryBean an jeder Stelle konfigurieren, wo eine Hibernate SessionFactory gefordert ist.
 

deamon

Bekanntes Mitglied
Vielen Dank für die Aufklärung! Ich habe sogar ziemlich schnell die entsprechende Stelle in der Spring-Dokumentation gefunden.

Nur warum geht es trotz der richtigen Konfiguration nicht? In dem DAO ist das Hibernate-Template, was ja mit der übergebenen Hibernate SessionFactory erzeugt werden sollte, null.
 

byte

Top Contributor
Keine Ahnung. Laut Doku sollte das HibernateTemplate implizit erzeugt werden, wenn Du die SessionFactory setzt. Ich habe HibernateDaoSupport um ehrlich zu sein nie benutzt, weil ich es unschön finde, von einer Spring Klasse zu erben. Stattdessen schreibe ich meine eigenen DAOs und benutze einfach das HibernateTemplate.

Versuch doch mal, ein HibernateTemplate als Bean zu konfigurieren und das dann dem HibernateDaoSupport zu übergeben. Das HibernateTemplate braucht einfach nur die SessionFactory.
 

ms

Top Contributor
So, nach langer Zeit auch mal wieder was von mir.

Ich verwende HibernateDaoSupport sehr oft und gerne, allerdings verwende ich nicht die Methode #getHibernateTemplate sondern gleich #getSession().

ms
 

byte

Top Contributor
Zwingend notwendig ist das HibernateTemplate zwar nicht, aber es enthält viele hilfreiche Methoden, um Hibernate Abfragen zu machen. Definitiv einen Blick wert. Bei Bedarf kommt man auch über das HibernateTemplate an die Session ran, so dass HibernateDaoSupport nicht zwingend notwendig ist.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Spring DM: Problem mit Tomcat als OSGI-Service Application Tier 1
G Spring/Hibernate exception Application Tier 17
S Spring: Klassen in anderer "Anmelden" Application Tier 16
RaoulDuke Spring - Bugfixes in 2.5.x Application Tier 4
G Spring rollbackFor Application Tier 8
MQue Spring Security Form Application Tier 3
D Spring konfigurieren mit XML, Annotionen oder Java? Application Tier 2
MQue Spring in Zukunft Application Tier 5
I Passwort verschlüsseln in DB mit Spring Application Tier 5
MQue Spring https Application Tier 7
I Security bei Spring? Application Tier 31
MQue Spring beans Application Tier 10
I Wieviel Projekte bei Spring? Webprojekt Application Tier 2
G Transaktionen Spring Application Tier 58
Y Spring und Hibernate Application Tier 2
K Spring DI existierendes Objekt übergeben Application Tier 2
G Spring applicationContext Application Tier 3
MQue Spring Autowired Application Tier 7
MQue Spring Proxys Application Tier 2
D Problem beim Testen von einer Spring-Anwendung Application Tier 8
MQue Spring BeanFactoryPostProcessor Application Tier 3
MQue Spring ApplicationContext Application Tier 20
S Spring util:list in eine andere importieren Application Tier 15
MQue Einsatz von Spring Application Tier 13
M Konfiguration WebApp/Spring Host-abhängig Application Tier 5
E Migration altes Framework (SOFIA) auf Spring Application Tier 3
D Automatische Typkonvertierung in Spring Application Tier 5
A Spring: JSP nimmt style.css nicht an Application Tier 3
G Spring Security Frage fuer Fortgeschrittene Application Tier 2
Y Spring + MyFaces - Exception bei Serverstart Application Tier 1
Y Maven MyFaces Hibernate Spring - Projekt Application Tier 1
byte [Spring] Referenced Bean not found Application Tier 2
M Spring - Leichtgewichtiger als JBoss? Application Tier 4
D Spring: setter injection von statischer Methode? Application Tier 1
reibi Spring Beans - Grundsatzfrage Application Tier 3
thE_29 Spring und XFire Frage Application Tier 3
H spring Application Tier 2
R Spring und Hibernate3 - CGLib Enhancement failed Application Tier 2
S Spring 2.0 Tutorial gesucht Application Tier 2
M JBoss Seam - Spring Application Tier 11
G [Spring+JSF]: VariableResolver und Scopes? Application Tier 1

Ähnliche Java Themen

Neue Themen


Oben