1.什么时候用update
1.可以更新一个detached对象,使其更新数据库,变为persistent
?
代码案例:
@Test
public void TestUpdate1(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.get(Teacher.class, 2);
session.getTransaction().commit();
/*System.out.println("-----detached---------");*/
?
t.setName("zhuhw1111");
Session session2 = sf.getCurrentSession();
session2.beginTransaction();
session2.update(t);
System.out.println("-----persistence---------");
session2.getTransaction().commit();
?
?
}
?
?
?
?
update星期二, 一月 05, 2016
?
vi. update
1.用来更新detached对象,更新完成后转为persist状态
2.更新transient对象会报错
3.更新自己手动设定id的transient对象可以(前提是数据库里有这条记录)
4.persistence状态的对象只要设定不同字段就会发生更新
5.更新部分更改的字段
? ?a)xml设定property标签的update属性;annotation设定@Column的updatable属性,
不过这种方式很少用,因为不灵活;
? ?b)使用xml中dynamic-update,JPA1.0 Annotation没有对应的属性,hibernate扩展?
? ? ? i.同一个session可以,跨session不行,不过可以用merge()(不重要)
? ?c)使用HQL(EJBQL)(建议)
?
?
第二种情况
Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
?
因为找不到id。
?
第三种情况
@Test
public void TestUpdate3(){
/*3.更新自己手动设定id的transient对象可以(前提是数据库里这条记录)*/
Teacher t = new Teacher();
t.setId(1);
t.setName("yuzhoua111");
Session session2 = sf.getCurrentSession();
session2.beginTransaction();
session2.update(t);
System.out.println("-----persistence---------");
session2.getTransaction().commit();
?
?
}
?
运行结果ok
?
四、
代码案例:
@Test
public void TestUpdate4(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.get(Teacher.class, 2);
? ? ? ? ? ? //4.persistence状态的对象只要设定不同字段就会发生更新
t.setName("dooder");
session.getTransaction().commit();
}
?
?
虽然看起来没执行update语句,但是t.setName("dooder");改变了缓存中的name数据;
在事务在提交,或是session被关闭的时候
session中保存的对象是否和数据库保存一致,如果不一致,会自动的执行update语句。
对应的数据库中的数据也要做update。
但是同上面三种是一样的,也是做了全部的更新。效率低。
?
运行结果:
执行了update
?
?update
? ? ? ? Teacher?
? ? set
? ? ? ? birthdate=?,
? ? ? ? _name=?,
? ? ? ? title=?,
? ? ? ? yourWifeName=?,
? ? ? ? zhicheng=??
? ? where
? ? ? ? id=?
?
?
五.在Teacher类中加入不更新的注解
@Column(updatable=false)
?
代码案例:
@Test
public void TestUpdate5(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.get(Teacher.class, 2);
//4.persistence状态的对象只要设定不同字段就会发生更新
t.setName("dooder_zhuhw");
session.getTransaction().commit();
}
?
在不想更新的类中的字段加上注解
@Column(updatable=false)
public String getTitle() {
return title;
执行结果:
?
不加之前
? ? update
? ? ? ? Teacher?
? ? set
? ? ? ? birthdate=?,
? ? ? ? _name=?,
? ? ? ? title=?,
? ? ? ? yourWifeName=?,
? ? ? ? zhicheng=??
? ? where
? ? ? ? id=?
?
?
在 title加上注解后,执行结果:
? update
? ? ? ? Teacher?
? ? set
? ? ? ? birthdate=?,
? ? ? ? _name=?,
? ? ? ? yourWifeName=?,
? ? ? ? zhicheng=??
? ? where
? ? ? ? id=?
?
在xml对应的配置是,在property update="true|false"
?
?
<hibernate-mapping >
<class name="com.zhuhw.hibernate.model.Student" dynamic-update="true" >
在同一个session里面,在更新完,会发出update语句了。而且只更新改到的东西。
?
如果跨session时。可以不听。
原文:http://yuzhouxiner.iteye.com/blog/2269040