我在学习冬眠时遇到了一个问题。我写了UnitTest和那里我尝试添加对象到DB。所有选择都正常工作,但插入不正常。
public class HibernateTutorial extends BaseTest {
@Autowired
SessionFactory sessionFactory;
@Test
@Transactional
public void hibernateTutorial() {
@SuppressWarnings("unchecked")
List<User> users = sessionFactory.getCurrentSession().createQuery("from User").list();
sessionFactory.getCurrentSession().saveOrUpdate(new User("HiberTest", "HiberPass", "Hiber@Mail.ru", "HiberSurname",
"HiberLastname", "HiberAddress", "123432"));
}
我也尝试过这样的东西
public class HibernateTutorial extends BaseTest {
@Autowired
SessionFactory sessionFactory;
@Test
@Transactional
public void hibernateTutorial() {
@SuppressWarnings("unchecked")
List<User> users = sessionFactory.getCurrentSession().createQuery("from User").list();
sessionFactory.getCurrentSession().saveOrUpdate(
new User("HiberTest", "HiberPass", "Hiber@Mail.ru", "HiberSurname", "HiberLastname", "HiberAddress", "123432"));
sessionFactory.getCurrentSession().getTransaction().commit();
}
}
它引发了一个异常,事务没有成功启动,但它添加了用户
这里有一个例外
组织。springframework。交易TransactionSystemException:无法回滚Hibernate事务;嵌套的异常是org。冬眠TransactionException:未在组织上成功启动事务。springframework。奥姆。冬眠3。HibernateTransactionManager。doRollback(HibernateTransactionManager.java:679)位于org。springframework。交易支持AbstractPlatformTransactionManager。org上的processRollback(AbstractPlatformTransactionManager.java:845)。springframework。交易支持AbstractPlatformTransactionManager。在org上回滚(AbstractPlatformTransactionManager.java:822)。springframework。测验上下文交易TransactionalTestExecutionListener$TransactionContext。组织上的endTransaction(TransactionalTestExecutionListener.java:512)。springframework。测验上下文交易TransactionalTestExecutionListener。endTransaction(TransactionalTestExecutionListener.java:290)位于org。springframework。测验上下文交易TransactionalTestExecutionListener。org上的afterTestMethod(TransactionalTestExecutionListener.java:183)。springframework。测验上下文TestContextManager。PostTestMethod(TestContextManager.java:406)位于org。springframework。测验上下文junit4。声明。RunAfterTestMethodCallbacks。在org上评估(RunAfterTestMethodCallbacks.java:90)。springframework。测验上下文junit4。声明。重复。在org上评估(SpringRepeat.java:72)。springframework。测验上下文junit4。SpringJunia是一名优秀的跑步者。runChild(SpringJUnit4ClassRunner.java:240)位于org。朱尼特。跑步者。BlockJunitClassRunner。org上的runChild(BlockJUnit4ClassRunner.java:49)。朱尼特。跑步者。ParentRunner 3美元。在org上运行(ParentRunner.java:193)。朱尼特。跑步者。ParentRunner 1美元。日程安排(ParentRunner.java:52)见org。朱尼特。跑步者。家长跑步者。org上的runChildren(ParentRunner.java:191)。朱尼特。跑步者。家长跑步者。访问org上的$000(ParentRunner.java:42)。朱尼特。跑步者。ParentRunner 2美元。在org上评估(ParentRunner.java:184)。springframework。测验上下文junit4。声明。RunBeforeTestClassCallbacks。在org上评估(RunBeforeTestClassCallbacks.java:61)。springframework。测验上下文junit4。声明。RunAfterTestClassCallbacks。在org上评估(RunAfterTestClassCallbacks.java:70)。朱尼特。跑步者。家长跑步者。在org上运行(ParentRunner.java:236)。springframework。测验上下文junit4。SpringJunia是一名优秀的跑步者。在org上运行(SpringJUnit4ClassRunner.java:180)。日食jdt。内部的junit4。跑步者JUnit4TestReference。在org上运行(JUnit4TestReference.java:50)。日食jdt。内部的朱尼特。跑步者测试执行。在org上运行(TestExecution.java:38)。日食jdt。内部的朱尼特。跑步者RemoteTestRunner。org上的runTests(RemoteTestRunner.java:467)。日食jdt。内部的朱尼特。跑步者RemoteTestRunner。org上的runTests(RemoteTestRunner.java:683)。日食jdt。内部的朱尼特。跑步者RemoteTestRunner。在org上运行(RemoteTestRunner.java:390)。日食jdt。内部的朱尼特。跑步者RemoteTestRunner。main(RemoteTestRunner.java:197)由:org引起。冬眠TransactionException:未在组织上成功启动事务。冬眠交易JDBCTransaction。在org上回滚(JDBCTransaction.java:183)。springframework。奥姆。冬眠3。HibernateTransactionManager。doRollback(HibernateTransactionManager.java:676)。。。还有25个
我发现你的代码中有两个问题。
1-您的交易尚未启动。
答:您必须使用getSession()。方法,然后再对数据库执行任何操作。
2.如果事务失败,没有回滚方法
答:请使用一个try-cat块,参见下面的示例。
我的代码示例:
public void salvarDB(Object object)
{
Session session = HibernateUtil.getSession();
HibernateUtil.beginTransaction();
try
{
session.save(object);
HibernateUtil.commit();
avisos.salvoComSucesso(object);
}
catch(ConstraintViolationException e)
{
avisos.registroJaInserido(object);
HibernateUtil.rollback();
}
catch (Exception ex) {
avisos.falhaAoSalvar(object);
HibernateUtil.rollback();
}
finally {
HibernateUtil.closeSession();
}
}
在4.3.0.Final版的hibernate文档中,提供了以下代码段来创建会话工厂: 这似乎已经过时,因为方法buildSessionFactory()已被弃用。创建会话工厂的正确方法是什么?
我对Hibernate中的会话和事务的概念有点困惑。据我所知,Hibernate使用会话(持久性上下文),它基本上是需要持久,删除或数据库中任何内容的实体的缓存。会话封装事务,因此我启动一个会话,然后创建一个事务。事务关闭后,持久性上下文中的所有内容都将刷新到数据库,如果我关闭会话,也会发生同样的事情。 为什么我需要两者?我可以在不创建交易的情况下做同样的事情吗?
1. 前言 本节课程将和大家一起聊聊 Hibernate 的核心组件之一: Session 对象。 通过本节课程,你将了解到: 创建 Session 对象的 2 个方法; 线程上下文的作用。 2. 创建 Session 对象 Session 是 Hibernate 的重要组件之一,是交给开发者的一把利剑。开发者可使用 Session 对象提供的增、删、改、查(Crud)等方法实现基础的数据操作。
1. 前言 Hibernate 的核心价值观是:开发者们!做你们应该做的。脏的、累的、没技术含义的由本尊来做。 本节课和大家一起好好的聊聊 Hibernate 的核心组件之一:会话工厂(SessionFactory)。 通过本节课,你将学习到: 会话工厂的设计要求; 会话工厂的核心功能。 2. 会话工厂的作用 原生 Jdbc 开发如同自己炒菜做饭,需经手买菜、洗菜、做菜……一系列过程。 基于 Hi
问题内容: 我知道会话不是线程安全的。我的第一个问题:将实体传递给另一个线程,对它做一些工作,然后将其传递回原始线程并进行更新,是否安全? 我的第二个问题:在一个线程中创建一个实体并将其保存在另一个线程中是否安全? 编辑 我忘了提到实体是为快速加载而专门配置的 问题答案: 否。该实体已附加到会话中,并包含链接到该会话的代理(以延迟自身加载)。因此,这样做将使用多个线程中的会话。由于会话不是线程安全
我找了很多解决办法。谢了。