2017-09-20 10 views
0

Java EEサーバーとしてWildflyを使用しています。我々は、コマンドデザインパターンの種類を実装するために使用しているフレームワークを持っています。新しいトランザクションがJTAで開始されたかどうかを確認する方法はありますか

私は私ができるような単純なワークフローを記述しようとするでしょう:

  • すべてのコマンドは、コマンドに関する情報を格納するエンティティである(実行のタイムスタンプ、成功状況等。)
  • Everyコマンドは、それがbusinesslogicが
  • すべてourコマンドは、コマンドクラスからextentedされ実行されるCommandEJBをだ持ち、their EJBのはCommandEJBクラスから拡張され
  • CommanEJBは特定のコマンド、のために上書きされるrunメソッドを呼び出しますビジネスその特定のコマンドに対して論理が実行される
  • その後、CommandEJBはCommandオブジェクト(ポイント1の説明に従ってコマンド実行に関する情報を保持する)を永続化しようとします
  • CommandEJB実装がエンティティを作成して永続化するこれで私たちは常に、私はそれがどのように動作するかを説明するためにいくつかのPSEUD-のコードを記述しようとするでしょう特定のコマンドとそのエンティティ

間の双方向assotiationを作るよりも、runメソッドの実装です:

私が持っていますPersonというPersonと私はCreatePersonCmdを持っています。新しい人物を作成し、それをデータベースに保存します。その後、フレームワークはCreatePersonCmdをデータベースに保持します。

@Stateless 
@WebService 
public class MyWebService { 
CreatePersonCmd cmd = new CreatePersonCmd(); 
executor.execute(cmd); 
} 

マイCreatePersonCmdが所有者である:コマンドの実行には、PersonエンティティとCreatePersonCmdエンティティは、私は、コマンドを呼び出すSAOP Webサービスを持っている

person.setCmd(cmd);

cmd.setPerson(person); 

によってリンクされていますCreatePersonCommandとPersonの関係を次のようにします。

public class CreatePersonCmd { 
@JoinColumn 
@OneToOne 
private Person person; 
} 
関係の他の側では

人です:私のCreatePersonEJBで

public class Person{ 
@OneToOne(mappedBy="person") 
private CreatePersonCmd createPersonCmd; 
} 

(そのrunメソッドの実装が呼び出される):

public class CreatePersonCmdEJB extends CommandEJB { 

public void run() { 

    Person person = new Person("John Doe"); 
    createPersonCmd.setPerson(person); 
    person.setCreatePersonCmd(createPersonCmd); 
    em.persist(person); 

} 

CommandEJBが、それは実行だ継続して保存しようとした後コマンド:

em.persist(createPersonCmd); 

しかし、実行はこの最後の行に到達したことがない、と私はで例外を取得:

em.persist(person); 

例外は次のとおりです。

Not-null property references a transient value - transient instance must be saved before current operation 

奇妙なことは、私は人の関係の所有者にあれば、すべてが正常に動作していることです。

双方向のOneToOneリレーションを持つ2つのエンティティCustomerとAddressを持つフレームワークを使用しない単純な例を作成しましたが、私が使用する永続的な順序であれば、常にコミットするテストを行います。ここで

は擬似コードです:

Customer c = new Customer("John Doe"); 
Address a = new Address("MyStreet", 1123); 

c.setAddress(a); 
a.setCustomer(c); 

em.persist(c); 
em.persist(a); 

どんなに持続の順序が何であるか(私は両方の線を持っている場合、最初のアドレスまたは顧客は常に細かいコミットしない)

しかし、私たちの枠組みの中で、それは以下のように思えます私たちのフレームワークのソースコードにはem.persist(person)の後にtrasactionsが終了し、em.flush()も表示されません。

私は同じ取引にいるかどうかわかりますか?私はトランザクションをem.getTransaction()で取得しようとしましたが、おそらくJava EEのトランザクションがアプリケーションコンテナによって管理されているため、A JTA EntityManager cannot use getTransaction()が得られます。

+0

'em.isJoinedToTransaction()' em'がアクティブなトランザクションに関連付けられている場合は、 'あなたを伝える必要があることによって行うことができる 。 – ujulu

答えて

0

すでにcreatePersonCmdが挿入されている場合は、現在の作業セットに追加する必要があります。

createPersonCmd = em.merge(createPersonCmd) 
関連する問題