2017-04-20 6 views
0

を使用せずに完全に正常に動作してsave()メソッド春データJPAでsave()メソッド春データJPA - 返されるエンティティの下

/** 
* Saves a given entity. Use the returned instance for further operations as the save operation might have changed the 
* entity instance completely. 
* 
* @param entity 
* @return the saved entity 
*/ 
<S extends T> S save(S entity); 

ともリソース以下のJavadocの特定は明らかに我々が必要と述べています返されたオブジェクトを使用して、保存されたエンティティに対してさらに操作を実行するようにします。上記のコードは、戻り値の型なしで働いているのはなぜ

Why to use returned instance after save() on Spring Data JPA Repository?

しかし、私の次のコードで

  • テストがあることを示しているように見える

    public void createEmployee(Employee employee) throws Exception { 
        try { 
         employee.setEmployeeName("alan"); 
         employeeRepo.save(employee); 
         employee.setEmployeeType("Permanent"); 
         employeeRepo.save(employee); 
        } catch (Exception e) { 
         throw new Exception(e); 
        } 
    
    } 
    
    1. ずにエンティティが正常に動作します()セーブマイデータは完全に永続化されていますが、正しい永続性を保証するために返されたエンティティを使用する必要があるという印象を受けました。

    私は間違いなく間違っていますか間違っていますか?私は春のデータが新しく、現在の多くのアプリケーションがCRUDに基づいているため、save()メソッドを完全に理解したいと考えています。ありがとう。

  • 答えて

    1

    SimpleJpaRepositoryのsave()メソッドは以下の通りです:

    新しいエンティティインスタンスの場合
    /* 
    * (non-Javadoc) 
    * @see org.springframework.data.repository.CrudRepository#save(java.lang.Object) 
    */ 
    @Transactional 
    public <S extends T> S save(S entity) { 
    
        if (entityInformation.isNew(entity)) { 
         em.persist(entity); 
         return entity; 
        } else { 
         return em.merge(entity); 
        } 
    } 
    

    save()方法は同じインスタンスを返すように、実際には関係ありません。 save()への最初の呼び出しは、従業員のインスタンスを管理および追跡になりますEntityManager.persist()に委譲しますと、コードがsave()に第二コールなくても動作するはずです(あなたはサービス層でアクティブなトランザクションを持っていると仮定)という

    注:任意のアクティブなトランザクション内のエンティティに対する変更は、トランザクションコミット時に自動的にデータベースにフラッシュされます(詳細はhttp://www.objectdb.com/java/jpa/persistence/managedを参照)。

    +0

    1. "新しいエンティティインスタンスの場合、save()メソッドが同じインスタンスを返すので実際には問題ありません" - どのような状況で差異インスタンスが作成されたのかを明確にしてください。 2.「アクティブトランザクション」とはどういう意味ですか....私は春データを使用していますが、トランザクションは春データによって管理されているので、おそらく混乱しています。誰もがアクティブなトランザクションについて語りますが、Springデータのコンテキストではそれはまさにそれですか?ありがとう – HopeKing

    +0

    Springデータはもちろん、この 'EntityManager.merge(..)vs' EntityManager.persist(..)に対する抽象化でしかないので、基本的なJPA APIを理解する必要があります。 **ポイント1 **:既存のインスタンスを更新する場合:http://stackoverflow.com/a/1070629/1356423 **ポイント2 **。トランザクションは通常、サービスレイヤーで定義されます。http://stackoverflow.com/a/19723602/1356423 –

    +0

    優れたリソースに多くの感謝をします。また、なぜ私の上記のコードは、保存で戻り値の型なしで動作しますか? – HopeKing

    関連する問題