1

私の側からもう 1 つ質問があります...ステートレス サービス (Stateless Session Bean) をファサード (GlobalService など) として使用し、そのメソッドが他のいくつかのサービス (SLSB、FooService や BarService など) を呼び出す場合:

@Stateless
@Remote(GlobalService.class)
@TransactionManagement(TransactionManagementType.CONTAINER)
public class GlobalServiceBean implements GlobalService{
private Logger log = Logger.getLogger(GlobalServiceBean.class);

@EJB
private FooService fooService;

@EJB
private BarService barService;

public void createFoo(Foo foo, Bar bar) throws WrappedGoneBadException{
          fooService.create(foo); // bang here 
              barService.create(bar); // no bang here

FooService のすべてのメソッド (ほぼ同じように見える BarService も同様) には、新しいトランザクションが必要であると注釈が付けられています。

@Stateless
@Remote(FooService.class)
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public class FooServiceBean implements FooService{
   public Foo save(Foo foo){
     ... // exception here

推定 FooServiceBean はタイプ 'Foo' のいくつかのオブジェクトを永続化します。この間、チェックされていない例外 (DuplicateKeyException) がスローされます。これはロールバックされる「周囲の」トランザクションに影響しますか、それとも無視されて Bar が作成されますか?

私の最初の考えは、それはトランザクションに影響を与えないということでしたが、Jboss は私が間違っていることを証明しました...

これは期待できる動作ですか、私は間違っていますか?もしそうなら...それらの両方を分離する方法: Foo は例外を引き起こし、明らかに保存されませんが、Bar は保存されますか?

4

1 に答える 1

0

残念なことに... 2 番目のトランザクションを続行する前に、クライアントが世界を停止する原因となったのは、不適切な例外処理でした。

于 2013-01-23T11:21:21.917 に答える