【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

相关文章
|
2月前
|
Java 数据库连接 API
解锁高效开发秘籍:深入探究 Hibernate 如何优雅处理一对多与多对多关系,让数据映射再无烦恼!
【9月更文挑战第3天】Hibernate 是 Java 领域中最流行的 ORM 框架之一,广泛用于处理实体对象与数据库表之间的映射。尤其在处理复杂关系如一对多和多对多时,Hibernate 提供了丰富的 API 和配置选项。本文通过具体代码示例,展示如何使用 `@OneToMany`、`@JoinColumn`、`@ManyToMany` 和 `@JoinTable` 等注解优雅地实现这些关系,帮助开发者保持代码简洁的同时确保数据一致性。
40 4
|
2月前
|
SQL Java 数据库连接
Hibernate 批量操作来袭!掌握最佳实践,轻松应对数据洪流,开启高效开发新时代
【9月更文挑战第3天】在软件开发中,高效数据操作至关重要。作为流行的Java持久化框架,Hibernate提供了强大的数据库操作功能。本文探讨了Hibernate批量操作,包括批量插入、更新和删除的最佳实践,通过使用原生SQL和`Session`的`createNativeQuery()`方法,结合`addBatch()`及`executeBatch()`方法实现高效批量操作。合理设置批量大小、事务管理和性能测试是优化的关键。在实际开发中,应根据业务需求和性能要求选择合适的方法,以提升程序性能和可维护性。
157 3
|
3月前
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
43 1
|
3月前
|
数据库 开发者 Java
颠覆传统开发:Hibernate与Spring Boot的集成,让你的开发效率飞跃式提升!
【8月更文挑战第31天】在 Java 开发中,Spring Boot 和 Hibernate 已成为许多开发者的首选技术栈。Spring Boot 简化了配置和部署过程,而 Hibernate 则是一个强大的 ORM 框架,用于管理数据库交互。将两者结合使用,可以极大提升开发效率并构建高性能的现代 Java 应用。本文将通过代码示例展示如何在 Spring Boot 项目中集成 Hibernate,并实现基本的数据库操作,包括添加依赖、配置数据源、创建实体类和仓库接口,以及在服务层和控制器中处理 HTTP 请求。这种组合不仅简化了配置,还提供了一套强大的工具来快速开发现代 Java 应用程序。
152 0
|
3月前
|
数据库 Java 数据库连接
Struts 2 与 Hibernate 的完美邂逅:如何无缝集成两大框架,轻松玩转高效 CRUD 操作?
【8月更文挑战第31天】本文通过具体示例介绍了如何在 Struts 2 中整合 Hibernate,实现基本的 CRUD 操作。首先创建 Maven 项目并添加相关依赖,接着配置 Hibernate 并定义实体类及其映射文件。然后创建 DAO 接口及实现类处理数据库操作,再通过 Struts 2 的 Action 类处理用户请求。最后配置 `struts.xml` 文件并创建 JSP 页面展示用户列表及编辑表单。此示例展示了如何配置和使用这两个框架,使代码更加模块化和可维护。
64 0
|
3月前
|
Java 数据库连接 数据库
|
3月前
|
缓存 Java 数据库连接
|
3月前
|
Java 数据库连接 API
|
3月前
|
Java 数据库连接 应用服务中间件