Java nsaction(从测试类中删除@Transactional),但这最终会导致性能问题。在Hibernate中修改实体的首选方法是 Entity foo = session.get(Entity.class,entityId); foo.x = y; Entity fooModified = session.get(Entity.class,entityId); //fooModified.x == y

Java nsaction(从测试类中删除@Transactional),但这最终会导致性能问题。在Hibernate中修改实体的首选方法是 Entity foo = session.get(Entity.class,entityId); foo.x = y; Entity fooModified = session.get(Entity.class,entityId); //fooModified.x == y,java,spring,hibernate,caching,Java,Spring,Hibernate,Caching,我相信问题在于Hibernate(和JPA)并不是真正用来作为本机SQL的接口,特别是SQL更新查询。Hibernate将维护会话级缓存。通常,它知道何时更新实体,以便条目不会在会话缓存中过时(至少不在同一线程中)。但是,由于您正在使用SQL更新查询更新实体,Hibernate不知道您正在更改其缓存中的实体,因此无法使其无效 总之,Hibernate缓存不适用于本机SQL更新查询。要使其正常工作,您必须在各自独立的事务中维护每个操作(从测试类中删除@Transactional),但这最终会导致性

我相信问题在于Hibernate(和JPA)并不是真正用来作为本机SQL的接口,特别是SQL更新查询。Hibernate将维护会话级缓存。通常,它知道何时更新实体,以便条目不会在会话缓存中过时(至少不在同一线程中)。但是,由于您正在使用SQL更新查询更新实体,Hibernate不知道您正在更改其缓存中的实体,因此无法使其无效

总之,Hibernate缓存不适用于本机SQL更新查询。要使其正常工作,您必须在各自独立的事务中维护每个操作(从测试类中删除@Transactional),但这最终会导致性能问题。在Hibernate中修改实体的首选方法是

Entity foo = session.get(Entity.class,entityId);
foo.x = y;
Entity fooModified = session.get(Entity.class,entityId);
//fooModified.x == y
哦,openSession()工作是因为它将创建一个新的一级缓存。哦,openSession()工作是因为它将创建一个新的一级缓存。
Entity foo = session.get(Entity.class,entityId);
foo.x = y;
Entity fooModified = session.get(Entity.class,entityId);
//fooModified.x == y