精华帖 (0) :: 良好帖 (1) :: 新手帖 (4) :: 隐藏帖 (6)
|
|
---|---|
作者 | 正文 |
发表时间:2011-03-18
总结的不错,赞一个~
|
|
返回顶楼 | |
发表时间:2011-03-18
cesymm 写道 总体来说,是初级贴.
纠证一点问题 Student stu = new Strudnet(); stu.setCarId(“1234”); // 打开 Session1, 开启事务 session1.save(stu); // 提交事务,关闭 Session1 stu.set(“4567”); // 对脱管对象进行更改 // 打开 Session2, 开启事务 session2.update(stu); // 提交事务,关闭 Session2 注:即使把 session2.update(stu); 这句去掉,提交事务时仍然会执行一条 update() 语句。 你把session2.update(stu);去掉不会执行update语句,只会执行第一个session.save()生成的insert 语句 我不太赞同 session的save()或者update()的操作就提交事务了, 事务操作不是session这类控制的,而session中的save()或者update()不过跟数据库进行insert,update是一样,没有commit,怎么就提交事务了呢 我们的理解就是对象进入了持久化状态,但如果你没有提交数据,别人查询的时候还是你操作之前的数据,如果有另一个事务同时访问同一数据,则出现锁表或者有能出现幻觉(脏数据)。 |
|
返回顶楼 | |
发表时间:2011-03-19
cczakai 写道 cesymm 写道 总体来说,是初级贴.
纠证一点问题 Student stu = new Strudnet(); stu.setCarId(“1234”); // 打开 Session1, 开启事务 session1.save(stu); // 提交事务,关闭 Session1 stu.set(“4567”); // 对脱管对象进行更改 // 打开 Session2, 开启事务 session2.update(stu); // 提交事务,关闭 Session2 注:即使把 session2.update(stu); 这句去掉,提交事务时仍然会执行一条 update() 语句。 你把session2.update(stu);去掉不会执行update语句,只会执行第一个session.save()生成的insert 语句 我不太赞同 session的save()或者update()的操作就提交事务了, 事务操作不是session这类控制的,而session中的save()或者update()不过跟数据库进行insert,update是一样,没有commit,怎么就提交事务了呢 我们的理解就是对象进入了持久化状态,但如果你没有提交数据,别人查询的时候还是你操作之前的数据,如果有另一个事务同时访问同一数据,则出现锁表或者有能出现幻觉(脏数据)。 既然已经提交事务,session关闭的话,数据已经更新到数据库内,session2.update 如果注释的话 绝对会不起作用 赞同楼上的 |
|
返回顶楼 | |
发表时间:2011-03-21
caoyangx 写道 你的标题少了一个b。
观察的相当仔细,漏掉的b,在看看你头像,果然很搭 |
|
返回顶楼 | |
发表时间:2011-03-22
已经该正过来了。
|
|
返回顶楼 | |
发表时间:2011-03-28
p_x1984 写道 已经该正过来了。 test-text |
|
返回顶楼 | |
发表时间:2011-03-28
请教个问题,对象是持久化状态,如果先delete(),然后执行update(), 对象是什么状态?用两个不同的session呢?是不是会报错啊?
|
|
返回顶楼 | |
发表时间:2011-03-28
21jhf 写道 请教个问题,对象是持久化状态,如果先delete(),然后执行update(), 对象是什么状态?用两个不同的session呢?是不是会报错啊?
public void testGet(){ Session session = null; Transaction tx = null; try{ session = SessionFactoryUtils.getSession(); tx = session.beginTransaction(); /*User user = new User(); user.setName("张三"); user.setPassword("123456"); user.setCreateTime(new Date()); user.setExpireTime(new Date()); */ User user = (User)session.get(User.class,"402880e42ef34964012ef34966530000"); session.delete(user); log.debug("++++++++++++++userName:"+user.getName()); user.setName("李四"); session.update(user); tx.commit(); }catch(Exception e){ e.printStackTrace(); tx.rollback(); }finally{ SessionFactoryUtils.closeSession(session); } } 测试过了,出现了异常 20:56:22,593 DEBUG Loader:2050 - done entity load 20:56:22,609 DEBUG HibernateTest:59 - ++++++++++++++userName:张三 org.hibernate.ObjectDeletedException: deleted instance passed to update(): [<null entity name>#<null>] at org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:50) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) at org.hibernate.impl.SessionImpl.fireUpdate(SessionImpl.java:742) at org.hibernate.impl.SessionImpl.update(SessionImpl.java:730) at org.hibernate.impl.SessionImpl.update(SessionImpl.java:722) at com.navagate.client.HibernateTest.testGet(HibernateTest.java:61) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at junit.framework.TestCase.runTest(TestCase.java:168) at junit.framework.TestCase.runBare(TestCase.java:134) at org.hibernate.testing.junit.UnitTestCase.runBare(UnitTestCase.java:63) at junit.framework.TestResult$1.protect(TestResult.java:110) at junit.framework.TestResult.runProtected(TestResult.java:128) at junit.framework.TestResult.run(TestResult.java:113) at junit.framework.TestCase.run(TestCase.java:124) at junit.framework.TestSuite.runTest(TestSuite.java:243) at junit.framework.TestSuite.run(TestSuite.java:238) at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 20:56:22,609 DEBUG JDBCTransaction:182 - rollback 20:56:22,625 DEBUG JDBCTransaction:193 - rolled back JDBC Connection 20:56:22,625 DEBUG ConnectionManager:427 - aggressively releasing JDBC connection |
|
返回顶楼 | |
发表时间:2011-03-29
21jhf 写道 21jhf 写道 请教个问题,对象是持久化状态,如果先delete(),然后执行update(), 对象是什么状态?用两个不同的session呢?是不是会报错啊?
public void testGet(){ Session session = null; Transaction tx = null; try{ session = SessionFactoryUtils.getSession(); tx = session.beginTransaction(); /*User user = new User(); user.setName("张三"); user.setPassword("123456"); user.setCreateTime(new Date()); user.setExpireTime(new Date()); */ User user = (User)session.get(User.class,"402880e42ef34964012ef34966530000"); session.delete(user); log.debug("++++++++++++++userName:"+user.getName()); user.setName("李四"); session.update(user); tx.commit(); }catch(Exception e){ e.printStackTrace(); tx.rollback(); }finally{ SessionFactoryUtils.closeSession(session); } } 测试过了,出现了异常 20:56:22,593 DEBUG Loader:2050 - done entity load 20:56:22,609 DEBUG HibernateTest:59 - ++++++++++++++userName:张三 org.hibernate.ObjectDeletedException: deleted instance passed to update(): [<null entity name>#<null>] at org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:50) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) at org.hibernate.impl.SessionImpl.fireUpdate(SessionImpl.java:742) at org.hibernate.impl.SessionImpl.update(SessionImpl.java:730) at org.hibernate.impl.SessionImpl.update(SessionImpl.java:722) at com.navagate.client.HibernateTest.testGet(HibernateTest.java:61) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at junit.framework.TestCase.runTest(TestCase.java:168) at junit.framework.TestCase.runBare(TestCase.java:134) at org.hibernate.testing.junit.UnitTestCase.runBare(UnitTestCase.java:63) at junit.framework.TestResult$1.protect(TestResult.java:110) at junit.framework.TestResult.runProtected(TestResult.java:128) at junit.framework.TestResult.run(TestResult.java:113) at junit.framework.TestCase.run(TestCase.java:124) at junit.framework.TestSuite.runTest(TestSuite.java:243) at junit.framework.TestSuite.run(TestSuite.java:238) at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 20:56:22,609 DEBUG JDBCTransaction:182 - rollback 20:56:22,625 DEBUG JDBCTransaction:193 - rolled back JDBC Connection 20:56:22,625 DEBUG ConnectionManager:427 - aggressively releasing JDBC connection 执行过delete说明这条记录已经删除了,你怎么还能做更新操作呢. |
|
返回顶楼 | |
发表时间:2011-03-29
skcmm 写道 cczakai 写道 cesymm 写道 总体来说,是初级贴.
纠证一点问题 Student stu = new Strudnet(); stu.setCarId(“1234”); // 打开 Session1, 开启事务 session1.save(stu); // 提交事务,关闭 Session1 stu.set(“4567”); // 对脱管对象进行更改 // 打开 Session2, 开启事务 session2.update(stu); // 提交事务,关闭 Session2 注:即使把 session2.update(stu); 这句去掉,提交事务时仍然会执行一条 update() 语句。 你把session2.update(stu);去掉不会执行update语句,只会执行第一个session.save()生成的insert 语句 我不太赞同 session的save()或者update()的操作就提交事务了, 事务操作不是session这类控制的,而session中的save()或者update()不过跟数据库进行insert,update是一样,没有commit,怎么就提交事务了呢 我们的理解就是对象进入了持久化状态,但如果你没有提交数据,别人查询的时候还是你操作之前的数据,如果有另一个事务同时访问同一数据,则出现锁表或者有能出现幻觉(脏数据)。 既然已经提交事务,session关闭的话,数据已经更新到数据库内,session2.update 如果注释的话 绝对会不起作用 赞同楼上的 会起作用 |
|
返回顶楼 | |