The lookup for the service bean was looking for the "BlahServiceTarget", rather than "BlahService". As a result, it was accessing the functionality of the service bean, but was bypassing the transaction definitions, hence the database updates were not wrapped up in database transaction properly. We didn't notice it previously as the filter that forces the Hibernate Session to stay open during the entire web call was effectively causing us to use the same database connection for the entire web call anyway.