`
王树雄
  • 浏览: 241938 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

hibernate 有关数据更新(不一定用到update方法)

 
阅读更多

在介绍hibernate的更新之前,我们先来看看session的两个方法。load和get方法;这两个方法是获取数据的根据对象的id值;

先看两段代码。load和get的方法都含有两个参数,前者是得到的对象类型。后者是一个可序列化的值,说白了也就是你要获取数据库里面对应的主键的值,你的主键如果是id。你获取的是第一条记录那么则是一,如果你的主键是name。你就写上某个名字。然后获取这个名字对应的数据记录。

 

当我们执行下面两条语句的时候,我们会发现第一条报错。而第二条是没有什么问题的。

 

但是如果我们把两个里面的打印语句都写到commit之前的时候。我们发现两个都不会报错了。

 

 

@Test
	public void testload(){
		Session session =null;
		session =sessionFactory.getCurrentSession();
		session.beginTransaction();
		
	    Teacher  t=(Teacher) session.load(Teacher.class, 1);
	    session.getTransaction().commit();
	    System.out.println(t.getName());
	}
	
@Test
	public void testget(){
		Session session =null;
		session =sessionFactory.getCurrentSession();
		session.beginTransaction();
		
	    Teacher  t=(Teacher) session.get(Teacher.class, 1);
	    session.getTransaction().commit();
	    System.out.println(t.getName());
	    
	}

  这里面是有原因的。当用load获取的时候,其实执行load语句只是将对象置入到内存中。而执行get方法的时候。不但将对象放入到了内存而且。对象执行了sql语句。对象的值已经在getName方法执行已经赋值了。而load方法。在执行getName方法的时候才执行sql语句,从数据库里面获取相关的记录。当我们在执行getName方法前后加上时间的时候。我们得到时间差的话我们会发现,我load这种情况下getName费许多的时间。而get这种情况几乎没有费什么时间。

那么为什么在提交之后,load得到getName的方法会出错呢。那是因为提交完之后。当前的session自动关闭了。当然这是getCurrentSession的情况下。而再去调用镀锡的getName方法的时候。session对象关闭了。相等于缓存中没有对应的记录了。只有数据库和内存中有。此时再无获取getname的时候没有中间桥梁session。那么肯定出错。而get方法的话。因为已经在get方法执行的时候将数据赋值给了对象。那么我们获取的时候直接从内存里面拿去好了。用不着经由session去访问数据库。所以不会出错。

 

下面来具体谈谈更新数据的情况

 

更新数据我们的第一反应是从数据库里面讲数据拿出来然后改变某些值,然后再调用update的方法完成操作。这种方法是对的。但是不是只有这一种方法的。我们还有不通过调用update方法就可以完成更新。update方法里面传入的对象。一定要有主键的值。并且主键的记录一定可以在数据库里面找得到,这样才不会报错的。所以我们可以先不用从数据库里面拿去对象。而是先定义一个对象。之后再给此对象赋值。然后更新此对象。如果给的值在数据库中含有那么对应的记录也可以然后更新。

 

    1.常规方法先从数据库里面拿取,然后更新

Session session =null;
	    session =sessionFactory.getCurrentSession();
	    session.beginTransaction();
		
	    Teacher  t=(Teacher) session.get(Teacher.class, 1);
	    t.setName("wsx");
                    session.update(t)	    session.getTransaction().commit();

   2.先创建一个对象,然后给其赋值。再更新。

 

Session session =null;
	    session =sessionFactory.getCurrentSession();
	    session.beginTransaction();
		
	    Teacher  t=new Teacher();
	    t.setName("wsx");
                    session.update(t)	   
                    session.getTransaction().commit();

 

   以上这两种方法都可以完成更新的操作。

 

   而以下的这种方法也是可以完成更新的。并且没有用到update方法;

 

  

Session session =null;
	    session =sessionFactory.getCurrentSession();
	    session.beginTransaction();
		
	    Teacher  t=(Teacher) session.get(Teacher.class, 1);
	    t.setName("wsx");	
                    session.getTransaction().commit();

 

 我们仔细瞧下来会发现。它与第一个方法的不同之处就是没有用到update方法。难道这也行吗?嗯。我肯定的告诉你。

 接下来我们探究其道理。

 当我们执行get方法的时候,其实在内存中,缓存session中,数据库中都有对应的Teacher对象。而当我们改变其内存中对象的名字的时候。我们再提交的话,其实是数据库事务会去检测,内存中的session对象的值和缓存session中的值是否一致,不一致的话,那么则提交更新。

 

 

更新数据时遇到的问题。

我们会发现更新数据的时候。如果一个表中有五个字段,而我们只更新一个字段比较说更新年龄字段的时候。那么我们会从打印日志中惊奇的发现我们的其他几个字段也更新了。这种更新方式是很不友好的。代价也很巨大。也许本来你只需更新一个年龄的值。而其他字段里面有一篇文章。那么你只简简单单更新一个年龄却引起一篇文章的更新。

根据这一问题,我们有一些几个解决问题的办法

1.通过annotation在某个不需要更新的字段的get方法之前加上@column(updatable=false);

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

 

这种方法的缺点是这个字段永远不会更新。这个我们一想就感觉很不灵活。也许某一天这个字段需要更新。但是也有永不更新的情况。这个很多。比如一个银行的名字。等待。

 

2.在xml配置文件里面class加上dynamic——update=true;

 

<hibernate-mapping>
	<class name="com.bjsxt.hibernate.Student"  dynamic-update="true">
		<id name="id" column="id"/>
		<property name="name" />
		<property name="age" />
    </class>
	
</hibernate-mapping>

 

  这样就会自动更新。但是我们的自动更新某些需要更新的列的话,我们必须要在同一个session中。不同的session。找不到参考依据的话,那么也会集体更新的。

 

 

 

	@Test
	public void testupdate1(){
		Session session =null;
		session =sessionFactory.getCurrentSession();
		session.beginTransaction();
	    Teacher  t=(Teacher) session.get(Teacher.class, 1);
	    t.setName("wsx");
	    session.update(t);
	    session.getTransaction().commit();
	    
	    
	    t.setName("wsx1");
	    Session session1 =null;
		session1 =sessionFactory.getCurrentSession();
		session1.beginTransaction();
                                session.update(t);	   
	    session.getTransaction().commit();
	}
	

 

   第一个session的update方法只会更新name。而第二个全部属性都会更新;

 

 

  3.用hql语句。你需要更新那个列,那么则写成相应的形式;

 

 

 

@Test
	public void testupdate2(){
		Session session =null;
		session =sessionFactory.getCurrentSession();
		session.beginTransaction();
	    
	    Query q=session.createQuery("update tablename set name='wsx' where id=1 ");
	    q.executeUpdate();
	    session.getTransaction().commit();
	    
	  
	}

 

  我们很多情况下用到第三种方式。 好了更新就讲到这儿。

 

 

 

 

2
0
分享到:
评论

相关推荐

    Hibernate中大量数据的更新

    本文将讨论使用 Hibernate 批量更新大量数据的方法和技巧。 批量更新的必要性 在实际应用中,我们经常需要将大量数据插入到数据库中,例如数据迁移、数据同步、数据备份等场景。在这些场景中,如果使用传统的 ...

    Hibernate update问题

    在处理数据更新时,Hibernate提供了多种方法,但同时也可能会遇到一些常见问题。本篇文章将深入探讨Hibernate更新机制及其可能遇到的问题,旨在帮助开发者更好地理解和解决这些问题。 1. **基本更新操作** ...

    Hibernate基本数据操作方法

    Hibernate基本数据操作方法 java struts hibernate

    Hibernate更新某些字段

    例如,在下面的代码中,我们使用 Session.update(t) 方法更新 Teacher 对象的 Name 属性: ```java public class TeacherTest { @Test public void update(){ Session session = HibernateUitl....

    HIBERNATE FOR NETBEANS 数据操作方法

    - **更新(Update):**修改对象属性后,调用`Session`的`update()`方法更新数据库。 - **删除(Delete):**调用`Session`的`delete()`方法删除对象。 6. **事务管理** - 数据操作通常涉及事务,使用`Session`...

    hibernate更新数据方法小结

    Session session=HibernateSessionFactory.getSession(); String sql=”from Usertable as user where user.username=?”; Query q=session.createQuery(sql); q.setString(0,username); List l=q.list(); Iterator...

    SSH CRM 项目Hibernate操作数据字典源码(3)

    若需插入或更新数据字典,可以先创建实体对象,设置属性值,然后调用Session的`save()`或`update()`方法。对于删除操作,可以使用`delete()`方法,传入待删除对象的引用。 此外,Hibernate还支持HQL(Hibernate ...

    Hibernate下数据批量处理解决方案

    对于更新和删除操作,可以使用`scroll()`方法,这在Hibernate 2.1.6或更高版本中是支持的。`scroll()`方法返回一个`ScrollableResults`对象,允许我们以游标方式处理结果集,这在处理大量数据时非常有效。同样,我们...

    配置hibernate数据源

    通过Hibernate API进行增删改查操作,常用的方法包括session.save(), session.get(), session.update()和session.delete()。 6. 进行单元测试。在代码开发完成后,需要对Hibernate的配置和实体类的映射进行测试,...

    spring3+Hibernate3+struts2 所用到的jar

    这个压缩包文件"spring3+Hibernate3+struts2 所用到的jar"包含了这三个框架协同工作所需的核心库,下面将详细解释这些框架以及它们的核心功能和相关配置文件。 1. **Spring框架**:Spring是一个全面的后端应用框架...

    spring hibernate整合的底层数据操作方法

    下面我们将深入探讨Spring与Hibernate整合的底层数据操作方法。 一、Spring与Hibernate整合基础 1. 依赖管理:整合Spring和Hibernate首先需要在项目中引入相应的依赖,通常包括Spring的核心库、Spring的数据访问/...

    Hibernate merge、update与saveOrUpdate方法的区别

    在Hibernate框架中,`merge`、`update`与`saveOrUpdate`这三个方法都是用于更新或保存实体对象到数据库中的,但它们之间存在着重要的区别,这些区别主要体现在对实体状态的处理方式上。 #### 1. `merge` 方法 `...

    Hibernate配置数据源.

    本文将详细介绍在Hibernate框架中配置不同数据源的方法,帮助读者更好地理解和应用这些配置。 #### 二、数据源的重要性 数据源是应用程序与数据库之间建立连接的重要桥梁。通过合理的数据源配置,可以有效提升...

    Spring+Hibernate多数据源

    我们需要扩展这个类,并实现determineCurrentLookupKey方法来决定当前应该使用哪个数据源。 接着,描述中的"Spring+Hibernate多数据源的整合实现demo"意味着这是一个实际操作的示例,它可能包含了一个或多个配置...

    使用hibernate封装方法

    通常,我们会在DAO(数据访问对象)层进行这些封装,将数据库的CRUD(创建、读取、更新、删除)操作隔离,以便服务层(Service)可以方便地调用。 1. **DAO设计**: - DAO接口定义了所有对数据库的操作,例如`save...

    Hibernate方法总结

    总的来说,HibernateTemplate提供了一组强大的方法来简化Hibernate的日常操作,涵盖了从简单的数据存取到复杂的数据库操作,极大地提升了开发效率。在实际应用中,根据数据量、性能需求以及业务逻辑,选择合适的方法...

    springboot2.0多数据源集成hibernate配置hibernateDaoSupport示例

    接下来,我们引入Hibernate的相关依赖,以便在项目中使用Hibernate作为ORM框架。在`pom.xml`中添加如下依赖: ```xml &lt;groupId&gt;org.springframework.boot &lt;artifactId&gt;spring-boot-starter-data-jdbc ...

    hibernate更新操作

    此外,如果对象在Session之外被更新,那么在更新之前需要调用`session.update(object)`来告诉Hibernate你打算修改这个对象。 总结来说,Hibernate的更新操作主要包括配置、创建SessionFactory、打开Session、查询...

    JAVA数据类型与Hibernate的类型映射

    通过Session的save()、update()、delete()和get()方法,可以实现对象的增删改查。 最后,对于大数据量的处理,Hibernate支持批处理和缓存机制。批处理可以减少数据库交互次数,提高性能;而缓存则可以在一定程度上...

Global site tag (gtag.js) - Google Analytics