0

我有一种方法可以在 EJB bean 中保存一个新对象。调用此方法,没有错误,但数据库中没有任何变化。我不明白为什么。

这是代码:

@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;
    }

...

和来电者:

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

你有想法吗?

4

3 回答 3

0

我看到您在客户端中注入了对 EntityManager 的引用(不知道为什么),但我在会话 bean 中没有看到它(可能只是因为您没有在消息中包含该行)。您是否可能忘记在无状态会话 bean 中使用注释 @PersistenceContext?

另外,请注意:根据您使用的 JPA 实现和 id 的生成策略,您应该在调用 getId( )之前调用 flush()。实际上,如果您让数据库生成您的 ID,那么您需要一个 flush() 在方法返回值之前发生这种情况。

于 2012-11-28T07:36:04.617 回答
0

谢谢,建议的解决方案有效!

我像这样使用容器管理的事务:

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

再次感谢!

于 2012-11-28T08:56:10.123 回答
-1

您的事务似乎从未提交,因此请尝试更改事务管理:

@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();
            }
      }
}
于 2012-11-26T08:16:48.830 回答