2012-02-18 6 views
1

コンテナ管理のエンティティBeanを使用しているときに、Beanはコンテナによってデータベースに格納されていますか? これは、いくつかのコード文を使用してサーブレット内で制御することができますか?またはコンテナがこれを自動的に内部的に管理しますか?コンテナ管理エンティティBeanを使用しているときに、Beanがコンテナによってデータベースに格納されている場合

+3

JPAエンティティについて、あるいは古いEJB2エンティティBeansについて話していますか? –

+0

古いEJB2エンティティBean – seahorse

答えて

1

トランザクションがコミットされると、基本的にデータベースに格納されます。あなたは

<ejb-jar> 
... 
<assembly-descriptor> 
... 
<container-transaction> 
<method> 
<ejb-name>EmployeeRecord</ejb-name> 
<method-name>*</method-name> 
</method> 
<trans-attribute>Required</trans-attribute> 
</container-transaction> 
<container-transaction> 
<method> 
<ejb-name>EmployeeRecord</ejb-name> 
<method-name>updatePhoneNumber</method-name> 
</method> 
<trans-attribute>Mandatory</trans-attribute> 
</container-transaction> 
... 

このa'la deplyment記述子にトランザクション境界でこれを制御することができCMPで

は、仕様からの抜粋であるhttp://download.oracle.com/otn-pub/jcp/ejb-2.1-fr-spec-oth-JSpec/ejb-2_1-fr-spec.pdf

は、ejb新しいトランザクションのメソッドを呼び出しますあなたの境界に応じてコンテナによって開始され、メソッドが正常に終了した場合、トランザクションはこれに応じてコミットされる可能性があります。たとえば、特定のメソッドがrequires-newで区切られている場合、になります。これは独自のトランザクションを持っているためですが、requireで区切られ、実行中のトランザクションで呼び出された場合(たとえば、例えば、requireまたはrequire-newで区切られたセッションBeanメソッドから)、その囲みトランザクションがコミットされるときにコミットされます。または、失敗した場合、そのメソッド内で行われた変更はロールバックされるだけでなく、囲むメソッド呼び出し/トランザクション内で行われた変更も反映されます。

デプロイメント記述子ではネストされたトランザクションが許可されている可能性がありますが、実際にはデータベースエンジンが最後のトランザクションをどのように処理するかが重要です。多くの場合、rdbmsはネストされたトランザクションを実際にはサポートしませんが、代わりにトランザクションのセーブポイントを使用するため、ejbパースペクティブから再帰的に現れるものは実際にはデータベース内で「線形」に起こります。しかし、ほとんどのシナリオで結果は同じです。

また、トランザクション分離レベルを検討することも関係あります。

+0

したがって、トランザクションがコミットされる前にサーバーがクラッシュした場合、エンティティの状態は失われますか? – seahorse

+1

@seahorseはい、他の場所に保存されている場合を除きます。 (再):コンテナがクラッシュした時点でエンティティの状態がトランザクションによって更新されていた場合、エンティティの状態は最後にコミットされたトランザクションの状態に自動的にリセットされます。 –

1

Beanの状態は、トランザクションがコミットされたときにデータベースに保存されることが保証されています。通常、コンテナは、トランザクションがロールバックされた場合の不要な更新を回避するために、状態を保存する前にコミット時間まで待機します。または、状態が単一のトランザクションで複数回変更された場合。

この仕様では、エンティティBeanに対する変更が、同じトランザクションで実行されるEJBQLクエリによって表示されることを確認する必要があります。つまり、EJBQLファインダが実行される前に、変更がデータベースに保存されます。

+0

クエリが変更と同じセッション/接続内で実行される場合、更新がまだコミットされていなくても、クエリはそのクエリに表示されます。そのセッション/トランザクションの外側に表示される内容は、トランザクション分離レベルによって異なります。 –

関連する問題