HibernateTemplate().save() aus dem Spring-Framework funktioniert nicht..

mahosand

Grünschnabel
Hallo zusammen,

ich habe vergeblich versucht eine save()-Methode zu testen, aber leider scheitert mein JUnit-Test.
Es geht um die DAO-Methode HibernateTemplate().save(user) aus dem Spring Framework, diese Methode soll das Objekt user in der Datenbank speichern und anschließend den generierten Primärschlüssel zurückgeben:

Die Dao-Klasse :

public class UserDao extends HibernateDaoSupport implements UserI{
.....
.....
public Integer saveUser(aUser) {

LOG.debug("flush mode: "+ getHibernateTemplate().getFlushMode());
return (Integer) getHibernateTemplate().save(aUser);
}


public User getUser(Integer id) {

return (User)getHibernateTemplate().get(User.class, id);
}
}

}

Die TestKlasse:


public class TestUserDaoImpl extends AbstractTransactionalDataSourceSpringContextTests{

private UserI userI;
private SessionFactory sessionFactory;
private static final Logger LOG = Logger.getLogger(TestUserDaoImpl.class);


public void setUserI(UserI aUser) {
this.UserI=aUser;
}
public void setSessionFactory(SessionFactory aSessionFactory) {
this.sessionFactory = aSessionFactory;
}

//Die Test-Methode
public void testSaveUser(){

User user=new User();
user.setUserName("XXX");
Date datum =new java.util.Date();
user.setDate(datum);

System.out.println("der id vor der Persistierung ist "+user.getUserId());
assertNull("id nicht null?", userf.getUserId());

Integer res=UserI.saveUser();

System.out.println("Der id nachdem Insert ist "+res.toString());
assertNotNull("id null?", user.getUserId());


}

protected String[]getConfigLocations(){
return new String[]{"applicationContext.xml"};
}

}


Als Rückgabewert bekomme ich immer eine 0, aber in der Datenbank sieht es so aus, dass die Primärschlüssel, die durch auto-increment generiert wurden, verbraucht sind..
D.h. wenn ich manuell einen Datensatz hinzufüge, wird nicht der nächst größere Schlüssel genommen, sondern der übernächste...
Und die getHibernateTemplate().get() funktioniert.
Was habe ich da falsch gemacht?
Es würde mich sehr freuen, wenn jemand mir helfen könnte, danke im voraus.

Mahosand
 
Hallo!

Wetten das die wunderbar funktioniert ;-)
Hibernate Speichert die Daten jedoch nur, wenn du die Interaktion mit einer Hibernate Session auch innerhalb einer Transaktion vollziehst und diese Commitest. Das übernimmt beispielsweise der HibernateTransactionManager für dich, wenn du ihn entsprechend konfiguriert hast. Pack einfach dein DAO oder sogar den Service der das DAO verwendet in ein TransactionProxyFactoryBean...

Schau mal ins angehängte Beispiel...

Gruß Tom
 

Anhänge

  • 27499attachment.zip
    41,9 KB · Aufrufe: 117
erstmal vielen danke für deine Antwort!
Ich hoffe, dass sie funktioniert
Aber Da ich in meiner TestKlasse die AbstractTransactionalSpringContextTests als Basisklasse benutze läuft schon damit das ganze innerhalb einer Transaktion.
Wenn ein Test von dieser Klasse erbt, nimmt er automatisch an einer
Datenbank-Transaktion teil. Am Ende des Tests wird ein Rollback auf die Transaktion
ausgeführt.
Für den Test habe ich ein Transaktions-Manager als Spring-Bean im
ApplicationContext definiert .
Für mein Test reicht die folgende Bean-Definition, um einen Transaktions-Manager im ApplicationContext
einzutragen:

<bean id="transactionManager" class="org.springframework.orm.
hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>


habe ich denn hier was falsches gemacht:confused:
 
Am Ende des Tests wird ein Rollback auf die Transaktion
ausgeführt.

Moment mal.. du machst ein Rollback und wunderst dich das in der Datenbank nichts ist? Oder hab ich dich hier völlig falsch verstanden?

Der Rollback macht doch alle Aktionen der Transaktion rückgängig. Das erklärt auch warum der Autoinc deiner DB dannach einen Zähler weiter ist.. der hat nämlich einen insert und einen delete gehabt, dabei wird der Zähler jedoch in den DBMS die ich kenne nicht zurückgesetzt.

Gruß
Dominik
 
Ich frage den generierten Schlüßel nach dem Commit, und bevor da ein Rolback gemacht wird, folgendes zeigt es:


15:13:48,765 DEBUG TransactionInterceptor:308 - Invoking commit for transaction on ipis.dao.UserDaoI.saveUser

Der id nachdem Insert ist: 0


15:13:48,765 DEBUG HibernateTransactionManager:718 - Triggering beforeCompletion synchronization
15:13:48,781 DEBUG HibernateTransactionManager:629 - Initiating transaction rollback
15:13:48,781 DEBUG HibernateTransactionManager:573 - Rolling back Hibernate transaction on Session [org.hibernate.impl.SessionImpl@14426a6]
15:13:48,781 DEBUG HibernateTransactionManager:747 - Triggering afterCompletion synchronization
15:13:48,781 DEBUG TransactionSynchronizationManager:270 - Clearing transaction synchronization............



:confused:

Grüße
Hind
 

Neue Beiträge

Zurück