2016-09-01 9 views
0

私が経験した限り、JPA/hibernateはデータベースに存在するか、トランザクション中に永続化されてデータベースにフラッシュされたエンティティを返します。要求されたとき - JPAコミットのみ(フラッシュされたエンティティを避ける)

アクティブなトランザクション、フラッシュされたエンティティなどを考慮せずに、データベースの状態をHibernateに依頼することができるクエリが必要です。これらの特定のケースでは、コミット。

flushmodeを 'COMMIT'に設定すると、この 'findCommittedEntities'メソッドを呼び出すような特定のケースでは、スキップされたエンティティをスキップするだけでDBを読みたいと思っています。

私が探しているものを示して簡単なコード:

@Transactional() 
public void mySampler(){ 
    Entity ent=new Entity(); 
    entityManager.persist(ent) 

    /*Here JPA/Hibernate configured with flushmode AUTO will flush the   
    *persisted entity to db. That's Perfect! 
    */ 
    List<Entity> entities=service.findEntities() 
    //So this list should be of size 1 assuming we started with an empty DB of course! 
    System.out.println(entities.size()) 

    //But I also would like to be able to read the DB as is: 
    List<Entity> entitiesCommited=service.findCommittedEntities(...) 

    //This should be of size 0 as transaction is not commited yet 
    System.out.println(entitiesCommited.size()) 

} 

だから私はそれを達成するために何をすべき?それとも全く不可能なのでしょうか?

環境に関しては、私はOSGiのと牡羊座JPA/JTAで働いているが、私は、私はすでに解決策を見つけたし、楽しみは他の誰かのために有用である可能性があるとして、これは私の質問に答えるために、ここで

答えて

0

を問題ではないはずだと思います:

メソッドの実装:

//We require a new transaction 
@Transactional(value = TxType.REQUIRES_NEW) 
public Entity findCommitedEntities(..){ 

    /*This is important to create a new one. Because if we use the one we 
     *are using in 'mySampler()' we would be running the query in the scope 
     *of the other transaction and not the new one*/ 
     EntityManager newTxEm=emf.createEntityManager() 

     //We join if it is not already to the new transaction 
     newTxEm.joinTrasaction(); 
       [...] 
     // we execute whatever named query that gets all entities 
       [...] 
     return entities; 
} 
: 一覧entitiesCommited = service.findCommittedEntities(...)

のようなものでなければなりません

関連する問題