Hibernate Envers claims EntityManager is closed

Viewed 431

I have a Spring (Boot) application on which I'm trying to use Hibernate Envers.

The following bar function throws an IllegalStateException: EntityManager is closed, while the foo function works flawlessly:

@Service
public class FoobarService {

    private final EntityManager entityManager;

    @Autowired
    public FoobarService(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    public Iterable<Foobar> foo() {
        return entityManager.createQuery("select f from Foobar f", Foobar.class).getResultList();
    }

    public Iterable<Foobar> bar() {
        System.out.println(entityManager.isOpen()); // <--- Returns true!

        AuditReader auditReader = AuditReaderFactory.get(entityManager);
        AuditQueryCreator queryCreator = auditReader.createQuery();
        AuditQuery query = queryCreator.forRevisionsOfEntity(Foobar.class, true);

        return query.getResultList();
    }

}

Does anybody know why it claims it's closed when the foo function clearly works (as stated above)?

PS: I've omitted the maven dependencies and entity mapping for brevity, as they're all working.

EDIT:

There's something really weird I can't figure out. Within the bar function, we can see that:

  1. entityManager.isOpen() returns true
  2. ((Session) entityManager.getDelegate()).isOpen() returns false

The AuditReaderFactory.get(EntityManager entityManager) function uses the second, this is why it complains the session is closed when it's not. I don't quite get why the delegate is closed, so:

  1. Why does the the factory uses the entityManager's delegate instead?
  2. Why the delegate is even closed?
0 Answers
Related