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!
- 4093 megtekintés
Hozzászólások
Szerintem felejtsd el web service-en a tranzakciot, lehet egyebkent. Ha mindenkepp java-bol akarsz db replikaciot, http felett, inkabb vmi ilyesmit: http://vjdbc.sourceforge.net/
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Elég érdekes megvalósítás...
- A hozzászóláshoz be kell jelentkezni