论坛首页 Java企业应用论坛

hibernate中session的三种状态

浏览 21839 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (4) :: 隐藏帖 (6)
作者 正文
   发表时间:2011-03-18  
  总结的不错,赞一个~
0 请登录后投票
   发表时间: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,怎么就提交事务了呢

我们的理解就是对象进入了持久化状态,但如果你没有提交数据,别人查询的时候还是你操作之前的数据,如果有另一个事务同时访问同一数据,则出现锁表或者有能出现幻觉(脏数据)。
0 请登录后投票
   发表时间: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 如果注释的话 绝对会不起作用  赞同楼上的
0 请登录后投票
   发表时间:2011-03-21  
caoyangx 写道
你的标题少了一个b。

观察的相当仔细,漏掉的b,在看看你头像,果然很搭
0 请登录后投票
   发表时间:2011-03-22  
已经该正过来了。
0 请登录后投票
   发表时间:2011-03-28  
p_x1984 写道
已经该正过来了。

test-text
0 请登录后投票
   发表时间:2011-03-28  
请教个问题,对象是持久化状态,如果先delete(),然后执行update(), 对象是什么状态?用两个不同的session呢?是不是会报错啊?
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间: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说明这条记录已经删除了,你怎么还能做更新操作呢.
0 请登录后投票
   发表时间: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 如果注释的话 绝对会不起作用  赞同楼上的

会起作用
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics