Tag: hibernate session

java.lang.ClassNotFoundException:javax.persistence.NamedStoredProcedureQuery – Hibernate错误

以上exception一直在抛出创建一个hibernate会话工厂。 在应用程序li​​b文件夹中有hibernate-jpa-2.1-api和javax.persistence.2.1.0。 我可以在两个jar中看到NamedStoredProcedureQuery类。 但我得到classnotfoundexception的运行时错误。 有什么建议吗?

Hibernate一级缓存 – 是否同步?

我知道Session是Hibernate使用的第一级缓存,一旦我们从session检索实体,后续对具有相同标识符的同一实体的 get调用将从session而不是DB中获取,直到session为止。 打开 。 话虽如此,我对hibernate如何将第一级缓存与DB同步有疑问? 请考虑以下情形 //Lets say I have created the session Session s1 = sessionFactory.getSession(); User u1 = s1.get(User.class, 1); //Getting User with ID=1 //s1 is not yet closed //Lets say I create some other session Session s2 = sessionFactory.getSession(); User u2 = s2.get(User.class, 1); //Getting User with ID=1 u2.setName(“Abc”); // Changed a […]

如何在活跃的spring事务中将数据刷新到db?

我想使用spring测试框架测试hibernate session的save()方法。 @Test方法是: @Test @Transactional public void testSave() { User expected = createUser(); getGenericDao().currentSession().save(expected); User actual = getUser(generatedId); assertUsersEqual(expected,actual); } 我想将用户刷新到数据库中。 我想让我的用户在这个方法之后进入数据库 getGenericDao().currentSession().save(expected); 然后我想使用spring数据框架转到数据库,并通过下一行获取此保存的用户: User actual = getUser(generatedId); 我尝试使用hibernate flush方法,如: currentSession().setFlushMode(MANUAL); //do saving here currentSession().flush(); 它不会将我的用户刷新到数据库中! 但是,如果我没有使用@Transactional spring注释并将我的用户保存在程序化的spring事务中,那么我实现了我想要的。 不幸的是,由于没有spring @Transactional,因此保存到db的用户不会回滚。 因此,我的测试方法会更改后续测试方法的db和行为。 所以我需要将我的用户刷新到db里面的测试方法(不是在最后),并在测试方法结束时回滚所有对db的更改。 UPDATE建议准备方法如下: @Transactional public void doSave(User user){ getGenericDao().currentSession().save(user); } 并且在testSave中调用doSave什么都不做。 执行此方法后,我仍然没有db中的用户。 我设置断点并从命令行检查我的数据库。 更新非常感谢您的回复。 问题是方法flush()没有把我的用户放到database.I尝试Isolation.READ_UNCOMMITTED它并没有把我的用户放入数据库。 […]

Hibernate的会话线程安全吗?

我需要知道,Hibernate的会话是否是线程安全的。 但很明显,每个线程都会附加一个新会话来执行。 但我的问题是,如果在一个线程中我更新了一个实体的某个值,那么在同一时间执行期间会反映在其他线程中吗? 我的问题是当我从两个线程顺序触发更新时,值正确更新但是当我几乎完全触发更新时它就失败了。 例如。 现阶段的表。 ID NAME MARKS ——- ——— ——– 1 John 54 我想做的是: Student student = session.load(Student.class, 1); student.setMarks(student.getMarks() + 1); session.update(student); session.close(); 当我尝试在循环中运行上面的代码(例如10)时,表“student”中的“marks”值被正确更新,即值更新为64,这是正确的。 但是当我尝试在线程环境中运行相同的代码时,它会产生错误的结果。