Salve a tutti voi
espongo il problema che sto avendo su un progetto J2EE in cui utilizzo EJB 2.1:

si tratta della gestione della transazione di un carrello della spesa.Un utente può aggiungere o rimuovere prodotti dal proprio carrello:tali operazioni faranno variare il numero delle quantità disponibili(per la vendita) dei prodotti stessi ("disponibilità" è un attributo persistente dell EJB Entity "Prodotto").l utente,eseguendo l operazione di "conferma ordine" terminerà la transazione con successo(commit) e la disponibilità dei prodotti nel DB verrà aggiornata definitivamente.
se l utente eseguirà l operazione di "svuota carrello",la transazione verrà abortita(rollback) portando la disponibilità dei prodotti alle quantità iniziali.

ora espongo la mia implementazione non funzionante:

la servlet utilizza i metodi di un session stateful bean "gestorecarrello" in cui eseguo la gestione diretta della transazione tramite UserTransaction ricavato dal SessionContext.

ad esempio, la "aggiungi prodotto" della servlet invocherà il metodo "transazione" del bean session stateful"gestore carrello", che inizierà(o continuerà,nel caso sia già presente) la transazione e a sua volta invocherà il metodo
"modifica prodotto" del session stateless bean (gestore prodotti), che poi agirà sull entity "Prodotto"per modificare l attributo persistente "disinibilità".

ecco il codice del bean session stateful"gestore carrello":

package session.gestorecarrello.server;

import javax.naming.*;
import javax.ejb.*;
import java.rmi.*;
import javax.rmi.*;
import java.util.*;
import bean.Prodotto;
import session.gestoreprodotti.shared.*;
import entity.prodotto.shared.*;
import javax.transaction.*;


/**
* This is the bean class for the GestorePrenotazioniBean enterprise bean.
* Created 20-mar-2008 16.42.51
* @author Pax
*/
public class GestoreCarrelloBean implements SessionBean{

private SessionContext sessionContext=null;
private InitialContext initialContext=null;
private UserTransaction trans=null;
private GestoreProdottiRemoteHome gestoreProdottiHome =null;



public void ejbCreate() {

try {

initialContext = new InitialContext();
Object o = initialContext.lookup("GestoreProdottiBean");
gestoreProdottiHome = (GestoreProdottiRemoteHome) PortableRemoteObject.narrow(o, GestoreProdottiRemoteHome.class);

} catch (ClassCastException ex) {
ex.printStackTrace();
} catch (NamingException ex) {
ex.printStackTrace();
}



}

public void ejbActivate() {}

public void ejbPassivate() {}

public void ejbRemove() {}

public void setSessionContext(javax.ejb.SessionContext sessionContext){
this.sessionContext = sessionContext;
}



public void transazione(Prodotto prodotto,String codice,boolean begin){
try {

trans = sessionContext.getUserTransaction();
System.out.println("status transazione : "+trans.getStatus());

GestoreProdottiRemote gestoreProdottiRemote=null;
gestoreProdottiRemote=gestoreProdottiHome.create() ;

if (begin==true) {
System.out.println("status beginPRE : "+trans.getStatus());
trans.begin();
System.out.println("status begin POST : "+trans.getStatus());
}

System.out.println("status begin POST POst111: "+trans.getStatus());
gestoreProdottiRemote.modificaProdotto(prodotto,co dice);
System.out.println("status begin POST POst222: "+trans.getStatus());

} catch (IllegalStateException ex) {
ex.printStackTrace();
} catch (SecurityException ex) {
ex.printStackTrace();
} catch (RemoteException ex) {
ex.printStackTrace();
} catch (NotSupportedException ex) {
ex.printStackTrace();
} catch (SystemException ex) {
ex.printStackTrace();
} catch (CreateException ex) {
ex.printStackTrace();
}


}

public void termina(boolean commit){

trans = sessionContext.getUserTransaction();

try {

if(commit==true){
System.out.println("status commit pre: "+trans.getStatus());
trans.commit();
System.out.println("status commit post: "+trans.getStatus());}

if(commit==false){
System.out.println("status rollback pre: "+trans.getStatus());
trans.rollback();
System.out.println("status rollback post: "+trans.getStatus());
}
} catch (IllegalStateException ex) {
ex.printStackTrace();
} catch (SecurityException ex) {
ex.printStackTrace();
} catch (RollbackException ex) {
ex.printStackTrace();
} catch (HeuristicMixedException ex) {
ex.printStackTrace();
} catch (SystemException ex) {
ex.printStackTrace();
} catch (HeuristicRollbackException ex) {
ex.printStackTrace();
}

}


}



il problema è che la rollback, pur venendo eseguita(il log del server mi conferma ciò, inoltre non viene lanciata alcuna exception), non fa ciò che mi aspetterei, ovvero far ritornare la disponibilità dei prodotti alla quantità iniziale.

Ringrazio voi tutti!