hibernate,在dao中用session.get() 或者sql语句取出来的po,进行set值时,不用session.update也能保存,我为了证明一下在dao中各种po的取法set的时候都会保存,做了以下的实验:
一、在dao中取数据、存数据
public void sessionGet(){
Test po = (Test)session.get(Test.class, "1");
po.setA("111aaa");
}
public void sqlGet(){
String sql = "from Test t where t.id=:id";
Query q = session.createQuery(sql);
q.setString("id", "2");
Test po = (Test)q.uniqueResult();
po.setA("222aaa");
String sql1 = "from Test t where t.id=:id";
Query q1 = session.createQuery(sql1);
q1.setString("id", "6");
List lst = q1.list();
if(lst != null){
Test po1 = (Test)lst.get(0);
po1.setA("666aaa");
}
}
用以上的方法,全部都保存进去了
我又试了一下。将po的取法放在一个方法里,然后另外一个方法去调用,然后进行set,方法如下:
public void methodGet(){
Test po = this.getSqlTest();
po.setA("4aaa");
Test po1 = this.getSessionTest();
po1.setA("5aaa");
}
Test getSqlTest(){
String sql = "from Test t where t.id=:id";
Query q = session.createQuery(sql);
q.setString("id", "4");
Test po = (Test)q.uniqueResult();
return po;
}
Test getSessionTest(){
Test po = (Test)session.get(Test.class, "5");
return po;
}
结果还是保存进去了,结果证明,只要在dao层取出po,然后进行set数据,不用update,数据就会保存进去。
二、从dao中取出数据在service层进行set,从dao中取出数据在action层进行set,
于是我又试了将po从dao层取出来,放到service层去set,没有用update,这时候还是可以保存数据。
而我试了将po从dao层取出来,放到action层去set,没有用update,这时候就保存不了数据了。
这个证明了在同一个事务中set值时不用update也是可以保存数据的。但是非一个事务下进行set时是保存不了数据的。
三、从dao中取出数据经过action层再进入service层进行set,这时候就保存不了数据
总结:只要在同一个事务中,不管是dao层还是service层对po进行set数据,不用update,数据就会保存进去。
而不是同一个事务的就无法实现不用update就保存数据的。