package pl.zgora.uz.wmie.fe.service.impl;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.ApplicationException;
import javax.ejb.EJB;
import javax.ejb.EJBException;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.jws.WebMethod;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.transaction.TransactionManager;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import pl.zgora.uz.wmie.fe.enums.DzialType;
import pl.zgora.uz.wmie.fe.hbm.classes.Dzial;
import pl.zgora.uz.wmie.fe.hbm.classes.Stanowisko;
import pl.zgora.uz.wmie.fe.service.DzialService;
/**
* @author Miro007
*/
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class StanowiskoService extends BaseService<Stanowisko, Integer>
implements pl.zgora.uz.wmie.fe.service.StanowiskoService {
@EJB
private DzialService dzialService;
public List<Stanowisko> getStanowiskaWithPracownicy() throws Exception {
List<Stanowisko> result = new ArrayList<Stanowisko>();
try {
Session session = getSession();
// pobranie seta
result = session.createCriteria(Stanowisko.class).list();
for (Stanowisko stanowisko : result) {
Hibernate.initialize(stanowisko.getPracowniks());
session.evict(stanowisko);
}
} catch (HibernateException e) {
handleException(e);
}
return result;
}
/*
* Przyklad metody z obsluga transakcji. Jezeli w BaseService nie ma
* oznaczenia @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
* to bedzie znaczylo ze wszystko idzie w jednej transakcji i zostanie
* skomitowana na koncu metody, poniewaz load(-1) powoduje blad to nie
* zostanie nic zapisane. W sytuacji
* @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) metody save
* zostana wykonane w osobnych transakcji:) zgodnie z kolejnoscia. UWAGA w
* konfiguracji hibernate trzeba dodac <property
* name="hibernate.transaction.auto_close_session">true</property> i
* <property name="hibernate.connection.isolation">2</property> aby
* zapisywal dane do bazy.
*
*/
public String getStanowiskoName(Integer id) throws Exception {
Context context = new InitialContext();
TransactionManager txm = (TransactionManager) context
.lookup("java:/TransactionManager");
javax.transaction.Transaction tx = txm.getTransaction();
System.out.println(tx);
Stanowisko s = new Stanowisko();
s.setNazwa("mirek");
pl.zgora.uz.wmie.fe.service.StanowiskoService stanowiskoService = (StanowiskoService) new InitialContext()
.lookup("StanowiskoService/remote");
stanowiskoService.save(s); // uwzgledni atrybut transakcji;samo save(s)
// nieuwzgledni
// inni tez maja ten problem u rozwiazuje sie go tak ze sie nie tworzy
// klas o roznych zakresach transakcji
Dzial d = new Dzial();
d.setNazwaDzialu("d");
d.setTyp(DzialType.N);
dzialService.save(d);
load(-10);
return "mirek";
}
}