Search code examples
databaseejbejb-3.0flushpersist

Persistence with EJB3 doesn't work


I have a method to save a new object in an EJB bean. This method is called, without error, but nothing changes in the database. I can't understand why.

Here is the code:

@Stateless(name = "Ar", mappedName = "ManagementBean")
public class ManagementBean implements IManagementBeanLocal, IManagementBeanRemote {
...
    @Override
    public int storeRawSms(String raw, String requestUid, String text, String service, boolean correctlyAnalysed, Date receivedTimestamp,
            boolean toBeAnalysed, String phoneNumber) {

        // Get phone number, create if it dosn't exist
        PhoneNumber pn = getOrCreatePhoneNumberPrivate(phoneNumber);

        // Create rawSMS
        RawSms rawSms = new RawSms(raw, requestUid, text, service, correctlyAnalysed, receivedTimestamp, toBeAnalysed, pn);

        // Store and return result
        em.persist(rawSms);
        int result =  rawSms.getId();

        em.flush();
        em.clear();

        return result;
    }

...

And the caller:

@PersistenceContext private EntityManager em; 
... 
int rawSmsIs = bean.storeRawSms(raw, requestUid, message, service, false, new Date(), true, sender);

Do you have an idea?


Solution

  • It seems that your transaction never commited, so try changing transaction management:

    @Stateless(name = "Ar", mappedName = "ManagementBean")
    @TransactionManagement(TransactionManagementType.BEAN)
    public class ManagementBean implements IManagementBeanLocal, IManagementBeanRemote {
    
          @Resource
          private UserTransaction utx;
    
          @Override
          public int storeRawSms(..) {
    
                try {
                      utx.begin();
                      ..
                      em.persist(rawSms);
                      int result =  rawSms.getId();
                      utx.commit();
                }
                catch(Exception ex) {
                      //EXCEPTION HANDLING
                      utx.rollback();
                }
          }
    }