0

新しいオブジェクトをEJBBeanに保存するメソッドがあります。このメソッドはエラーなしで呼び出されますが、データベースでは何も変更されません。理由がわかりません。

コードは次のとおりです。

@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

おかげで、提案されたソリューションは機能しました!

私は次のようなコンテナ管理のトランザクションを使用します:

@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 に答える
0

クライアントにEntityManagerへの参照を挿入しているようですが(理由はわかりません)、セッションBeanには表示されません(メッセージに行が含まれていなかったためか)。ステートレスセッションBeanでアノテーション@PersistenceContextを使用するのを忘れた可能性はありますか?

また、注意してください。使用しているJPA実装とIDの生成戦略によっては、getId()を呼び出す前にflush()を呼び出す必要があります。実際、DBにIDを生成させる場合、メソッドが値を返す前にこれを実行するには、flush()が必要です。

于 2012-11-28T07:36:04.617 に答える
-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 に答える