【hibernate框架】核心开发接口-update方法

1.更新一个Detached(脱管状态)对象,把它重新变成Persistent(持久化状态),然后在数据库里做更新。

示例:

public void testUpDate1(){
	Configuration cfg=new Configuration();
	SessionFactory sf=cfg.configure().buildSessionFactory();

	Session session=sf.openSession();
	session.beginTransaction();
	Teacher teacher=(Teacher)session.get(Teacher.class, 1);
	session.getTransaction().commit();

	teacher.setName("mr.zhang");
	Session session2=sf.openSession();
	session2.beginTransaction();
	session2.update(teacher);
	session2.getTransaction().commit();

}

2.更新Transient(游离状态)对象会报错
3.更新自己设定id的Transient(游离状态)对象才可以
示例:

public void testUpDate2(){

	//这样更新Transient(游离状态)对象会报错
	/*Teacher teacher=new Teacher();
	teacher.setName("mr.liu");

	Configuration cfg=new AnnotationConfiguration();
	SessionFactory sf=cfg.configure().buildSessionFactory();

	teacher.setName("mr.zhang");
	Session session2=sf.openSession();
	session2.beginTransaction();
	session2.update(teacher);
	session2.getTransaction().commit();*/

	//给他设置id,只要数据库中有,就会更新Transient(游离状态)
	Teacher teacher=new Teacher();
	teacher.setId(8);
	teacher.setName("mr.liu");

	Configuration cfg=new AnnotationConfiguration();
	SessionFactory sf=cfg.configure().buildSessionFactory();

	teacher.setName("mr.zhang");
	Session session2=sf.openSession();
	session2.beginTransaction();
	session2.update(teacher);
	session2.getTransaction().commit();

}

由于每次更新都要更新所有字段,在你不更新其他多余字段的情况下比较浪费资源,所以要考虑下面的“5.更新部分更改的字段”

4.Persistent状态的对象只要设定不同字段就会发生更新。

public void testUpDate3(){

	Configuration cfg=new AnnotationConfiguration();
	SessionFactory sf=cfg.configure().buildSessionFactory();

	Session session=sf.openSession();
	session.beginTransaction();
	Teacher teacher=(Teacher)session.get(Teacher.class, 1);
	teacher.setTitle("高等");
	session.getTransaction().commit();

}

在get出teacher对象时它发出了一条update语句,原因是我们改了它的name了。因为修改数据了,所以在提交(commit();)时,session会检查缓存和数据库的同步情况,当不同步时,就更新数据库至两者同步。不幸的是还是更新了所有字段。

5.更新部分更改的字段
a)xml设定property标签的update属性,annotation设定@Column的updatable属性,不过这种方式很少用,因为不灵活。
annotation做法示例:

@Column(updatable=false)
public String getName() {
	return name;
}

在不需要更新的字段或字段的get方法上加Column(updatable=false)注解即可。
xml做法示例:
<property update="false" .../>

b)使用xml中的dynamic-update,JPA1.0 Annotation没有对应的属性(等待hibernate扩展)

xml示例:
例如 <class name="Student" table="student" dynamic-update="true">
对student对象的数据实行动态更新(没改过就不更新了)。

示例:

public void testUpDate4(){

	Configuration cfg=new AnnotationConfiguration();
	SessionFactory sf=cfg.configure().buildSessionFactory();

	Session session=sf.openSession();
	session.beginTransaction();
	StudentPK sp=new StudentPK();//联合主键
	sp.setId(2);
	sp.setName("s2");
	Student student=(Student)session.get(Student.class, sp);
	student.setAge(100);//只更新年龄
	session.getTransaction().commit();

}

这里看到hibernate发出的sql语句只更新了一个属性:
update
        student 
    set
        age=? 
    where   //联合主键
        id=? 
        and name=?

题外话:
对于dynamic-update,同一个session可以,跨session不行,不过可以用merge()代替原来的update。merge()将这个对象合并到数据库中,原来没改的就没必要合并了(比较不是从缓存中比较的,而是从数据库load出数据去比较,效率并没有提高多少)(不重要)

c)使用HQL(EJBQL)(建议)

public void testUpDate5(){

	Configuration cfg=new AnnotationConfiguration();
	SessionFactory sf=cfg.configure().buildSessionFactory();

	Session session=sf.openSession();
	session.beginTransaction();
	//HQL面向对象的查询语言,此时就只会更新name自己
    Query q=session.createQuery("update Teacher t set t.name = 't22' where t.id = 2");
    	q.executeUpdate();
	session.getTransaction().commit();

}

观察hibernate发出的sql语句确实如此,很方便。记住,HQL是面向对象的SQL语句。

总结:你要觉得全更新字段效率可以不考虑,就可以不去理会它(说不定数据库中也会进行优化,没改的它就不改了)。

转载请注明出处:http://blog.csdn.net/acmman

时间: 2024-09-14 13:46:23

【hibernate框架】核心开发接口-update方法的相关文章

【hibernate框架】核心开发接口-saveOrUpdate方法与delete方法

1.saveOrUpdate方法剖析 saveOrUpdate方法:分情况看是save还是update. 示例: public void testSaveOrUpdate(){ Teacher t=new Teacher(); t.setName("t21"); t.setTitle("低级"); t.setBrithday(new Date()); t.setZhicheng(ZhiCheng.C); Configuration cfg=new Configura

【hibernate框架】核心开发接口-Clear方法与flush方法

1.Clear方法:无论是load还是get,都会首先查找缓存(一级缓存),如果没有,才会去数据库查找,调用clear()方法可以强制清除session缓存. 示例: public void testClear(){ Configuration cfg=new AnnotationConfiguration(); SessionFactory sf=cfg.configure().buildSessionFactory(); Session session=sf.openSession(); s

【hibernate框架】核心开发接口-load和get方法

Load方法,从数据库里取数据,并封装成JAVA对象. 示例: public void testLoad(){ Configuration cfg=new AnnotationConfiguration(); SessionFactory sf=cfg.configure().buildSessionFactory(); Session session=sf.openSession(); session.beginTransaction(); //形参1:class-将取出的数据当做什么对象来存

【hibernate框架】核心开发接口-Configuration接口

Configuration接口: a)AnnotationConfiguration b)进行配置信息的管理 c)用来产生SessionFactory d)可以在configure方法中指定hibernate配置文件 e)只需关注一个方法即:buildSessionFactory() 1.关于Configuration 什么叫做Configuration? new 出来一个Configuration()方法,调它的configure()方法, 默认它会加载hibernate.cfg.xml文件,

HIBERNATE核心开发接口介绍

Gender类 package com.zzk.hibernate.model; public enum Gender { MALE, FEMALE } Student类 package com.zzk.hibernate.model; public class Student { private int id; private String name; private int age; private String sex; private boolean good; public boole

Hibernate框架学习之三:深入映射文件的配置

前言 这里主要是对XML版的Hibernate框架的开发进行说明,Annotation版会在另外的文章中在说明.由于Hibernate是一个全方位的ORM框架,那么要实现从Object到Record的完全过渡,实现的桥梁就是这里要讲的映射文件了.映射文件的内容繁多,主要是以开发中会使用到的为主进行说明.大体说来,映射文件主要是对class的映射,还包括属性,属性有分为主键.普通属性与集合属性,甚至还有复合类型等.每种属性都需要进行不同的配置,官方文档看得有点累,所以这里一并做一个总结. 映射文件

【HIBERNATE框架开发之一】搭建HIBERNATE环境并成功运行第一个项目HELLOHIBERNATE并解决3个常出现的运行问题;

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/hibernate/783.html OK,从这篇开始Himi将与大家一起进入Hibernate框架的学习啦,新手新手的说,希望大家多多指教: 对于Hibernate概述一下: "  Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. H

java-hibernate框架,测试update方法时报空指针

问题描述 hibernate框架,测试update方法时报空指针 上面提示33行,33行也就一个字段一个方法,两个都找得到的 解决方案 可能是传进去的参数 或是执行的HQL语句问题,没有把数据插入. 空指针的情况很多哦! 解决方案二: user可能是空,,查一下数据库,是不是id为1的那个被删除了

开发自己的Web服务处理程序(以支持Ajax框架异步调用Web服务方法)

当你添加Asp.net AJAX功能到你的Web程序的时候,你需要在Web.config中做一些改变,需要你显式地移除默认的ASMX处理程序并且添加asp.net ajax框架自己的脚本处理器来作为ASMX处理程序.在上一篇异步调用Web服务方法中,我们谈论过,ajax框架的asmx(ScriptHandler)是不支持异步调用Web服务方法的,所以为了让asp.netajax支持异步Web方法调用,我们需要避开该处理器,以提供自定义的处理器来取代它. Asp.netAJAX框架的ASMX处理器