Hibernate+JAX-WS tranzakciókezelés

Fórumok

Hello,

Lassan, de biztosan halad a projektünk.
A kliens oldalon szeretnék tranzakciókezelést megvalósítani, eddig kevés sikerrel. Az okát csak sejtem, ezért kérnék némi segítséget.

Adott egy HrpUsersServiceImpl osztály, amit web service-ként hirdetek.


package hu.xxx.ws;

import hu.xxx.model.HrpUsers;
import hu.xxx.services.HrpUsersBo;
import javax.jws.WebService;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@WebService(endpointInterface = "hu.xxx.ws.HrpUsersService")
public class HrpUsersServiceImpl implements HrpUsersService {

    @Autowired
    HrpUsersBo HrpUsersBo;

    Transaction tx;

    @Override
    public HrpUsers getUser(String name) {
        //HrpUsers a = null;
        //HrpUsersBo.getDaoSession().beginTransaction();
        //a = 
        tx=HrpUsersBo.getDaoSession().getTransaction();
        return (HrpUsersBo.findByLoginName(name));
    }

    @Override    
    @Transactional
    public String saveUser(HrpUsers u) {
        HrpUsersBo.save(u);
        return "saved";
    }

    @Override
    public void beginTransaction() {
        HrpUsersBo.getDaoSession().beginTransaction();
    }
    
    @Override
    public void commit() {
        tx=HrpUsersBo.getDaoSession().getTransaction();
        if(!tx.wasCommitted()) {
           tx.commit(); 
        }
    }
    @Override
    public void rollback() {
        tx=HrpUsersBo.getDaoSession().getTransaction();
        if(!tx.wasRolledBack()) {
           tx.rollback(); 
        }
    }

    @Override
    public String updateUser(HrpUsers u) {
           tx=HrpUsersBo.getDaoSession().getTransaction();
           HrpUsersBo.update(u);
           return "updated";
    }

    @Override
    public String deleteUser(HrpUsers u) {
           tx=HrpUsersBo.getDaoSession().getTransaction();   
           HrpUsersBo.delete(u);
           return "deleted";
    }

}

Ezt a szolgáltatást hívom meg egy kliensből.


    public void Populate() throws DatatypeConfigurationException {
        URL url;

        try {
            bo.getDaoSession().beginTransaction();
            List a = bo.findAll();  #elkérek egy másik db-ből egy listát
            bo.getDaoSession().close();
            
            if (!a.isEmpty()) {
                url = new URL("http://localhost:8084/ws/userService?wsdl");
                QName qname = new QName("http://ws.xxx.hu/", "HrpUsersServiceImplService");
                Service service = Service.create(url, qname);
                HrpUsersService hello = service.getPort(HrpUsersService.class);
                Date t = new Date();
                hello.beginTransaction(); #indítanék egy tranzakciót
                Iterator l = a.iterator();
                while (l.hasNext()) {
                    HrpUsers r = (HrpUsers) l.next();
                    hu.xxx.ws.HrpUsers wr = new hu.xxx.ws.HrpUsers();
                    hu.xxx.ws.HrpUsersPK wrPk = new hu.xxx.ws.HrpUsersPK();
                    wrPk.setCompany(r.getHrpUsersPK().getCompany());
                    wrPk.setLoginName(r.getHrpUsersPK().getLoginName());
                    wrPk.setTaxNr(r.getHrpUsersPK().getTaxNr());
                    wr.setHrpUsersPK(wrPk);
                    wr.setEmail(r.getEmail());
                    wr.setFirstName(r.getFirstName());
                    wr.setLastName(r.getLastName());
                    wr.setPassword(r.getPassword());
                    wr.setStatus(r.getStatus());
                    wr.setCru(r.getCru());
                    wr.setCallerId(r.getCallerId());
                    GregorianCalendar c = new GregorianCalendar();
                    c.setTime(r.getCrd());
                    XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
                    wr.setCrd(date2);
                    hello.saveUser(wr);  #save
                    System.out.println(r.getHrpUsersPK().getLoginName() + " " + r.getFirstName());
                }
                    hello.commit(); #majd a lista végén commit
                    Date t2 = new Date();
                    System.out.println(t2.getTime()-t.getTime());
            }

           

        } catch (MalformedURLException ex) {
            logger.error(ex);
        }
    }

A probléma az, hogy a tranzakció indítás és commit nem működik, csak akkor ha a HrpUsersServiceImpl osztályba a megfelelő metódusnál bele teszem a beginTransaction-t.
Namost nyilván nem lenne célszerű minden egyes rekordnál tranzakciót nyitni meg commit-álni ezért készítettem beginTransaction illetve egy commit metódust, ami nyitja a tranzakciót illetve commit-álja.
Gondolom azért nem működik mivel minden egyes hello.saveUser() egy új http kérés.
Szerver oldalról próbálva természetesen csont nélkül megy a tranzakciókezelés.
Ha lenne javaslatotok szívesen venném.
Köszönöm!

Hozzászólások

Közben továbbléptem a dologban. Egész nap

a

property name="exposeTransactionAwareSessionFactory"

illetve a

hibernate.current_session_context_class

beállításokkal szívattam magam. (Nem vettem észre az elsőt és sehogy sem működött.

Most azt mondja h

Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started

Ha debuggolom a szerver oldalt, ott a beginTransaction hívásakor létrejön a tranzakció, ami még a save előtt is megvan. De a hibaüzenetből nem úgy tűnik. Nincsenek nagy illúzióim, de azért szeretném körbejárni a témát.
Köszi.