tutorials.de Buch-Aktion 02/2012
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
1402
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    mahosand mahosand ist offline Mitglied
    Registriert seit
    Oct 2004
    Beiträge
    15
    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
     

  2. #2
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.724
    Blog-Einträge
    29
    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
    Angehängte Dateien Angehängte Dateien
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  3. #3
    mahosand mahosand ist offline Mitglied
    Registriert seit
    Oct 2004
    Beiträge
    15
    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
     

  4. #4
    TheLightning TheLightning ist offline Mitglied Brokat
    Registriert seit
    Aug 2004
    Beiträge
    464
    Zitat Zitat von mahosand Beitrag anzeigen
    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
     

  5. #5
    mahosand mahosand ist offline Mitglied
    Registriert seit
    Oct 2004
    Beiträge
    15
    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............





    Grüße
    Hind
     

Ähnliche Themen

  1. Spring Security NTLM & Spring Framework 3.0
    Von Thomas Darimont im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 2
    Letzter Beitrag: 26.01.10, 12:50
  2. Antworten: 14
    Letzter Beitrag: 05.08.09, 09:55
  3. Spring MVC MultiPart-FileUpload funktioniert nicht
    Von pizza1234 im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 3
    Letzter Beitrag: 14.11.08, 14:34
  4. Planung Serversoftware mit Spring als Framework, wie Spring einsetzen?
    Von DarthShader im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 8
    Letzter Beitrag: 26.09.08, 19:05
  5. Spring Framework
    Von Jack im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 4
    Letzter Beitrag: 18.11.05, 15:32