Как читать - когда запрошено - JPA фиксируется только (избегать сбрасываемых сущностей)

Насколько я знаю, JPA/hibernate будет возвращать сущности, которые либо существуют в базе данных, либо были сохранены во время транзакции, а затем сброшены в базу данных.

Я хотел бы иметь возможность для некоторых запросов запрашивать у Hibernate базу данных как есть, без учета какой-либо активной транзакции, сбрасываемой сущности и т. Д. В этих определенных случаях я хочу только прочитать, что она зафиксировала.

Установка для flushmode значения 'COMMIT' - это не то, что я ищу, так как я хочу только читать DB как пропущенные сбрасываемые сущности - в некоторых случаях, например, при вызове этого метода 'findCommittedEntities'.

Простой код, который показывает, что я ищу:

@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 и Aries JPA/JTA, но я думаю, что это не должно иметь значения

1 ответ

Чтобы ответить на мой вопрос, поскольку я уже нашел решение и с нетерпением жду, может быть полезным для кого-то еще:

Реализация метода: список entityCommited=service.findCommittedEntities(...)

должно быть что-то вроде:

//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; 
}
Другие вопросы по тегам