私の側からもう 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 は保存されますか?