关于hibernate修改数据的疑惑

问题描述

各位大神,请教一个关于hibernate修改数据的问题,看代码 public void addUser(){ System.out.println("begin......."); Session session = null; Transaction transaction = null; session = SessionFactoryUtil.getSessionFactory().openSession(); transaction = session.beginTransaction(); System.out.println("开始修改用户信息"); User u = (User)session.get(User.class, 2); u.setUsername("ddTest"); session.saveOrUpdate(u); System.out.println("修改用户信息成功。。。。"); transaction.commit(); session.close(); System.out.println("end......."); }这样可以把一个ID为2的用户数据name改为ddTest,没有什么疑问。再看 public void addUser(){ System.out.println("begin......."); Session session = null; Transaction transaction = null; session = SessionFactoryUtil.getSessionFactory().openSession(); transaction = session.beginTransaction(); System.out.println("开始修改用户信息"); User u = (User)session.get(User.class, 2); u.setUsername("ddTest"); //session.saveOrUpdate(u); System.out.println("修改用户信息成功。。。。"); transaction.commit(); session.close(); System.out.println("end......."); }这样,不用saveOrUpdate,数据一样被成功修改。这是为什么呢?是事务在提交时把一级缓存里的对像flush到数据库了吗?那如果这样的话要saveOrUpdate之类的方法还有什么用呢?求高手大神解惑,小弟在此感谢。

解决方案

你没有分清Hibernate里面实体的状态,你这两个例子里面实体的状态都是“持久”的状态(都是你刚查出来的,实体是在session里面持久态的)考虑如果是从画面取来的值,设置到了实体里面,这时候这个实体是和session脱离的“瞬时”状态,这种东西用saveOrUpdate才有意义。你可以看看Hibernate的API的程序,当你传进saveOrUpdate方法的实体是一个“持久”状态的实体,那么它什么都不做的,就和你第二个例子相同。如果你传入的是一个“瞬时”态的东西,比如你新做出来的,或者从别的已经close的session里面查出来的东西,那么再调用它就有意义了。他会看ID是否有,来决定做更新还是插入,还会去检查版本号(如果你配置了版本检查的话)。。。等等一系列动作。
解决方案二:
hibernate的update方法不是sql update的替代品或者翻译。hibernate屏蔽了你直接操作数据库操作sql。update也好,直接set也好,你修改的目标都是内存中的某个对象模型,而hibernate会将这个对象的修改同步到数据库。

时间: 2024-09-30 19:18:07

关于hibernate修改数据的疑惑的相关文章

session-关于hibernate修改数据的疑惑

问题描述 关于hibernate修改数据的疑惑 各位大神,请教一个关于hibernate修改数据的问题,看代码 public void addUser(){ System.out.println("begin......."); Session session = null; Transaction transaction = null; session = SessionFactoryUtil.getSessionFactory().openSession(); transactio

hibernate 修改数据时,修改前的值与修改中的值的比较

问题描述 我现在要对某条记录进行修改,在Serivce中,从action中传递过来了记录的实体,如代码:public void saveResource(Resc resource) {//要进行分开,A->是新增资源,B->修改资源 两种情况在刷新缓存情况不同boolean isNew = (resource.getResourceId() == null);String path = "";resourceDao.getSession().clear();resourc

注解-hibernate不能删除和修改数据但是能查询,和新增询数据

问题描述 hibernate不能删除和修改数据但是能查询,和新增询数据 不能删除和修改数据:但是能查,和新增询数据.删除和修改数据也不报错.这是最郁闷的,也不知道错在哪儿.我是用的hibernate实体注解来做的. 解决方案 最终还是自己解决了,伤不起啊. 解决方案二: 问题可能出在数据的guid码上,每一次添加都会生成一个唯一的GUID码,但是你删除的时候如果是通过其他的字段删除,可能会因为某些字段不能为空(比如说GUID)导致删除失败.只能通过查找GUID来单个的删除 解决方案三: 什么意思

hibernate取出数据并修改后不更新到数据库

问题描述 hibernate取出数据并修改后不更新到数据库 2C 有文章表article hbm:和文章对应的题目表item hbm: 他们为一对多关系,现在在数据库中一篇article对应有18个item,问:怎么样从一片文章中随机抽取6个item再将这个article放到struts2的堆中时,数据库中的每篇文章依然对应18个item;怎么每次我取出来后,数据库中的文章只对应6个item??? 解决方案 数据库修改后Hibernate的配置更新数据库修改后Hibernate的配置更新 解决方

Hibernate作为数据持久层的分析和研究

数据 摘要 在Java技术中有许多方法可以对数据进行持久化,持久层也是Java应用程序中最重要的部分之一.本文在分析了3种持久层主流解决方案的基础上,介绍了O-R映射开源项目Hibernate,并介绍了在Web应用开发中怎样配置Hibernate的环境,并使用它建立一个应用. 关键字 hibernate,数据持久化,JDBC, EJB,JDO 数据持久层简介 J2EE的三层结构是指表示层(Presentation),业务逻辑层(Business Logic)以及基础架构层(Infrastruct

java中前台可以修改数据成功,但是数据却不能更新到数据库中。

问题描述 java中前台可以修改数据成功,但是数据却不能更新到数据库中. 在前台修改了数据成功后,可是数据库的数据却没有更新,还是以前的数据. <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforg

关于Hibernate级联数据表的存储问题(多对一)

问题描述 本问题来自Struts2.1权威指南一书第19章例19.4问题,是一个关于Hibernate关联数据表存储的问题.整个例子的目标就是建立一个WEB应用,在一个input.jsp页面上输入父亲和儿子信息,点击提交按钮,将这两个持久化对象的信息写入数据库中的两个数据表中,两个数据表分别是person(代表父亲)和son(代表儿子).他们的关系是1(person)对N(son)我在调试这个例程的时候遇到一个问题,就是在向数据库中写入持久化对象时出现错误提示如下:Caused by: java

hibernate-Hibernate 级联配置 无法修改数据

问题描述 Hibernate 级联配置 无法修改数据 有两张表 shop 和cart 在cart中设置外键 ,结果不允许修改 shop中的内容? shop表 配置如下 cart 表配置如下 </class> 解决方案 看不到你的配置代码啊!. 在执行修改的时候报错了吗?

Hibernate的数据查找,添加!

1.首先看一下测试数据库的物理模型 2.测试所需要的Hibernate的jar包 3.数据库的sql /*==============================================================*/ /* DBMS name: MySQL 5.0 */ /* Created on: 2015/7/3 23:17:57 */ /*==============================================================*/ dr