gene b.
gene b.

Reputation: 11984

Native SQL select forces flushing in transactional method

I have a transactional method where objects are inserted. The debugger shows that upon eventsDAO.save(..) the actual insert doesn't take place, but there is only a sequence fetch. The first time I see insert into events_t .. in the debugger is when there's a reference to the just-inserted Event.

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = false)
public void insertEvent(..) {

   EventsT eventsT = new EventsT();
   // Fill it out...
   EventsT savedEventsT = eventsDAO.save(eventsT);  // No actual save happens here
   // .. Some other HQL fetches or statements ...

   // Actual Save(Insert) only happens after some actual reference to this EventsT (below)
   // This is also HQL
   SomeField someField = eventsDAO.findSomeAttrForEventId(savedEventsT.getId());
}

But I also see that this only holds true if all the statements are HQL (non-native).

As soon as I put a Native-SQL Select somewhere before any actual reference to this table, even if it does not touch the table in any way, it forces an immediate flush and I see the statement insert into events_t ... on the console at that exact point.

If I don't touch the table EventsT with my Native SQL Select in any way, why does the flushing happen at that point?

Upvotes: 1

Views: 660

Answers (1)

SternK
SternK

Reputation: 13041

According to the hibernate documentation:

6.1. AUTO flush

By default, Hibernate uses the AUTO flush mode which triggers a flush in the following circumstances:

  • prior to committing a Transaction

  • prior to executing a JPQL/HQL query that overlaps with the queued entity actions

  • before executing any native SQL query that has no registered synchronization

So, this is expected behaviour. See also this section. It shows how you can use a synchronization.

Upvotes: 3

Related Questions