Как читать - когда запрошено - 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;
}