2017-01-19 13 views
0

私はWildfly 10で動作するJava/Spring Webアプリケーションを使用しています.JAを設定して、更新と削除の文を実行するのが一般的な方法です。たとえば、httprequestがサーバーに入り、Personレコードに関するすべての詳細を表示するとします。私はこのレコード次に、この人物の詳細が画面に表示されているJPA /エンティティマネージャを使用してオブジェクトを更新する

class PersonDao 
{ 
    @PersistenceContent 
    entityManager entityManager 

    public Person findPerson(int id) 
    { 
     assert(id >= 0); //pseudocode 

     Person p = this.entityManager.find(Person.class,id); 

     assert(p != null); //pseudocode 

     return p; 
    } 
} 

を見つけるために、エンティティ・マネージャを使用しますが、要求が終了したスレッドがなくなっています。エンティティマネージャの添付されたPersonレコードは、自分のコードでアクセスできなくなりました。

時間が経つと、ユーザーが年齢を更新するために新しい要求が開始されます。現在私のDAOクラスでは、私はいつもレコードを再検索して、それが私の永続コンテキストに存在すると確信していますが、重複して退屈なようです。それを更新する必要がある(再び)あなたがこれを行う方法が正しいPersonオブジェクトを取得するには

Person p = this.findPerson(id); 

を呼び出して、正しい

public void updatePersonAge(int id, int newAge) 
    { 
     assert(newAge >= 0) 

     Person p = this.findPerson(id); 

     p.setAge(newAge); 

     this.entityManager.persist(p); 
    } 
+0

persistは更新のためには機能しません。使用する呼び出しはmerge()であり、おそらく冗長であっても、JPAは管理対象エンティティの変更を追跡し、その変更を自動的にデータベースと同期させます。 – Gimby

答えて

0

理由:私はこれを実装するためのより良い方法を知りたいのですが説明したように、エンティティマネージャはPersonオブジェクトにアクセスできなくなりました。

+0

パフォーマンスに関して、エンティティマネージャは実際に別の選択を行うのですか、またはキャッシュからpersonオブジェクトを取得しますか? – user1884155

+0

この場合、別の選択を使用します。 – Nate

1

これを行う方法は、PersonDaoの代わりにPersonRepositoryを作成することです。 "Spring Data JPA for more info."

あなたが一度それを知ったら、それは簡単に学ぶことができ、素晴らしいものです。あなたのダオは今ちょうどあなたがこのファイルには何も入れていない場合でも、あなたは今、更新を作成するconviencesを持っている...

public interface PersonRepository extends JpaRepository<Person, Integer> { 
    //custom queries here... 
} 

ようになり、それに基づいてクエリインタフェースでIDで見つけ、そしてうJpaRepositoryからすべてを削除します。

私は、これはあなたがすでにオブジェクト

に新しい時代を直接オブジェクトをシリアル化できると仮定している。また、これはないかもしれません

@Service 
public class PersonService { 

    private PersonRepository personRepository   

    @Autowired 
    public PersonService(PersonRepository personRepository) { 
     this.personRepository = personRepository; 
    } 

    // typically you would have create, findById and other methods here 

    public void updatePersonAge(int id, int newAge) { 
     assert(newAge >= 0) 

     Person p = personRepository.findOne(id); 

     p.setAge(newAge); 

     personRepository.save(p); 
    } 

    // but if you want an easy way to do this and you can 
    // serialize the whole object instead of just get the id you can 
    // simply call and update method 
    public Person update(Person person) { 
     assert(person.getId() != null); 
     return personRepository.save(person); 
    } 

} 

、上記のケースを処理するためにPersonServiceを作成しますエンティティマネージャを直接使用していないため、探しているソリューションです。

+0

私はこの入力に本当に感謝していますが、チュートリアルを読んだ後、私はそれがあまりにも多くのものだと思います。私はJPAを学んだり使用したりするのが初めてなので、抽象化/フレームワークの別のレイヤーを追加するのは時期尚早です。これは、私がJPAで快適になった(または定型文に悩まされた)後に再び見直すようなものです。ありがとう! – user1884155

+0

例が必要な場合は教えてください!それはたくさんあるようですが、あなたが思う以上に簡単で、異なるレイヤーについて学ぶのは難しくありません。私は通常、リポジトリ(Dao)、サービス(ビジネスロジック)、コントローラ(休止中のエンドポイント)パターンを使用します。抽象化がたくさんあるように思えますが、懸念を分けて分かりやすくなっています。また、Hibernate/JPAを使用してエンティティを直接DBテーブルに変換します。 しかし、あなたがまだ個人的なプロジェクトのためにJPAを学習し、探求しているなら、私が言ったことを無視することができます。不慣れなトピックでは圧倒され、不必要な混乱を加える必要はありません。 –

関連する問題