首页 > Windows开发 > 详细

032_CoreAPI_Update

时间:2016-01-07 02:10:09      阅读:312      评论:0      收藏:0      [点我收藏+]

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时。可以不听。

032_CoreAPI_Update

原文:http://yuzhouxiner.iteye.com/blog/2269040

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!