`
东京日和
  • 浏览: 11859 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

HIbernate对象处理

阅读更多
SSH的j2ee开发中,需要遇到一个hibernate直接操作数据库,不通过对象,直接对数据库进行操作。
Spring的orm包中,对hibernate的数据库操作进行了封装,封装以后,可以直接调用HibernateTemplate类的实例,进行DB操作。因为,需要实现对数据库操作,查了一下资料可以直接调用HibernateTemplate的bulkUpdate()操作来执行数据库的操作。
问题主要出现在这里了,这是我写的一段的HQL语言,使用bulkUpdate接口来执行的。
			HibernateTemplate ht = getHibernateTemplate();
			int num = ht.bulkUpdate("UPDATE Option op set op.optionMean= ?  where op.optionMean= ?", new Object[]{newDimname,oldDimname});

理应我的这段代码会update DB中的Option表的相关数据。在tomcat下,这段code成功的跑完了,也没有抛出任何异常信息,但是就是DB中的相关表中没有更新。
然后我再测试组件里面同样的执行了这段code,没有任何问题。
自己查资料分析,也没有得出一个很清晰的解决思路。在水木上问了,基本认为:1.是transaction基本上是有问题的;2.或者Spring对hibernate的transaction托管会出现问题。我们来依次分析这些原因:
1. 查看原始的HibernateTemplate.bulkUPdate的源代码
	public int bulkUpdate(final String queryString, final Object... values) throws DataAccessException {
		return executeWithNativeSession(new HibernateCallback<Integer>() {
			public Integer doInHibernate(Session session) throws HibernateException {
				Query queryObject = session.createQuery(queryString);
				prepareQuery(queryObject);
				if (values != null) {
					for (int i = 0; i < values.length; i++) {
						queryObject.setParameter(i, values[i]);
					}
				}
				return queryObject.executeUpdate();
			}
		});
	}

从源代码中我们可以看到基本上Spring orm包中做的封装工作主要是两部分:
a.session管理。
b.简化hql语言的使用。
然后我们在查看相应的log信息:
INFO  com.sgcp.system.entity.OptionDAO  - 更新的数据库条目数量:80 com.sgcp.system.entity.OptionDAO.replaceDimName(OptionDAO.java:43)
说明这个transaction已经执行了,并且返回了相应更新的数据库的行数。
2.SpringFrame 的session管理,相应执行transaction应该都是没有问题的,因为在测试的code中也是由SpringFrame来管理的,执行是成功的。所以SpringFrame对hibernate的托管是没有问题的。
所以现在已经判定query已经被执行了,那么现在是什么问题呢?
在查看资料中,发现hibernate中的执行会有一个cache,为了减少code对db的hits。因为cache有一个write-behind策略,就是update的对象,对那些update的对象,如果在最近没有再read的话,那就晚些写回DB中,这样如果要再次update的话,就可以少一次update。
但是因为,我在执行完query,有对session进行了flush过,所以这种可能也被排除了。
为了确定我的判断,我后来用直接从db中用对象方式读取符合条件的Options,set相应的属性值,后在attachDirty这些对象,但是也没有用。
最后再仔细排查code以后,原来这些rows对应的对象其实已经被读取进来了。就是说那些对象已经被存储到了hibernate中的cache中了。
这个就是问题的关键所在了,如果我们直接update数据库了的话,database中的那些rows和在hibernate中的数据缓存中的相应的对象就会变成脏的对象。
所以我猜测就是有可能是hibernate在检查bulkUpdate的操作时,会检查原先的缓存中,是否已经有要更新的行对应的对象,有的话,就不允许进行这类的操作。
后来,我直接取出hibernate中缓存中的相应对象,然后更新后,对这些对象进行attachDirty().数据库就成功更新的了。
但是就是不知道为什么hibernate没有报错。
分享到:
评论

相关推荐

    Hibernate 对象持久化

    一份我在厦门邦初学习 的快速入门ppt 内容有: ...Hibernate对象关系映射 对象的状态 Hibernate的检索策略 Hibernate检索数据的方式 数据库事务与并发处理 组件及组成关系映射 综合项目应用:Struts+Hibernater

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

    6.3 Hibernate用对象标识符(OID)来区分对象 6.4 Hibernate的内置标识符生成器的用法  6.4.1 increment标识符生成器  6.4.2 identity标识符生成器  6.4.3 sequence标识符生成器  6.4.4 hilo标识符生成器  ...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    6.3 Hibernate用对象标识符(OID)来区分对象 126 6.4 Hibernate的内置标识符生成器的用法 128 6.4.1 increment标识符生成器 131 6.4.2 identity标识符生成器 133 6.4.3 sequence标识符生成器 134 6.4.4 hilo...

    JDBC与Hibernate区别

    ◆操作的对象不同:JDBC操作的是数据,将数据通过SQL语句直接传送到数据库中执行,Hibernate操作的是持久化对象,由底层持久化对象的数据更新到数据库中。 ◆数据状态不同:JDBC操作的数据是“瞬时”的,变量的值...

    精通Hibernate:对象持久化技术第二版part3

    6.3 Hibernate用对象标识符(OID)来区分对象 126 6.4 Hibernate的内置标识符生成器的用法 128 6.4.1 increment标识符生成器 131 6.4.2 identity标识符生成器 133 6.4.3 sequence标识符生成器 134 6.4.4 hilo...

    hibernate3源码

    Hibernate是一种Java语言下的对象...Hibernate不仅负责从Java类到数据库表的映射(还包括从Java数据类型到SQL数据类型的映射),还提供了面向对象的数据查询检索机制,从而极大地缩短的手动处理SQL和JDBC上的开发时间。

    Hibernate 3.2.0中文离线手册

    Hibernate是一个面向Java环境的对象...Hibernate不仅仅管理Java类到数据库表的映射(包括Java数据类型到SQL数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。

    Hibernate体系结构的概要图

    这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。  SessionFactory接口 SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建...

    hibernate基础实验

    (2) Hibernate对JDBC进行了轻量级的对象封装,使Java程序员可以随心所欲地使用OO编程思想来处理数据库。 (3) Hibernate采用映射元数据来描述对象-关系的映射细节,元数据通常采用XML。 (4) 关系数据库中的元组...

    hibernate3.2 中文参考开发手册

    Hibernate是一个面向Java... Hibernate不仅仅管理Java类到数据库表映射(包括Java数据类型到SQL数据数据的映射),还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间......

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

    6.3 Hibernate用对象标识符(OID)来区分对象 6.4 Hibernate的内置标识符生成器的用法  6.4.1 increment标识符生成器  6.4.2 identity标识符生成器  6.4.3 sequence标识符生成器  6.4.4 hilo标识符生成器  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

    6.3 Hibernate用对象标识符(OID)来区分对象 6.4 Hibernate的内置标识符生成器的用法  6.4.1 increment标识符生成器  6.4.2 identity标识符生成器  6.4.3 sequence标识符生成器  6.4.4 hilo标识符生成器  ...

    Hibernate+中文文档

    10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载对象 10.4. 查询 10.4.1. 执行查询 10.4.2. 过滤集合 10.4.3. 条件查询(Criteria queries) 10.4.4. 使用原生SQL的查询 10.5. 修改...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

    6.3 Hibernate用对象标识符(OID)来区分对象 6.4 Hibernate的内置标识符生成器的用法  6.4.1 increment标识符生成器  6.4.2 identity标识符生成器  6.4.3 sequence标识符生成器  6.4.4 hilo标识符生成器  ...

    Hibernate实战(第2版 中文高清版)

    第三部分 会话对象处理  第9章 使用对象   9.1 持久化生命周期   9.1.1 对象状态   9.1.2 持久化上下文   9.2 对象同一性和等同性   9.2.1 引入对话   9.2.2 对象同一性的范围   9.2.3 脱管对象的同...

    hibernate3.2中文文档(chm格式)

    10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载对象 10.4. 查询 10.4.1. 执行查询 10.4.2. 过滤集合 10.4.3. 条件查询(Criteria queries) 10.4.4. 使用原生SQL的查询 10.5. 修改...

    HibernateAPI中文版.chm

    10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载对象 10.4. 查询 10.4.1. 执行查询 10.4.2. 过滤集合 10.4.3. 条件查询(Criteria queries) 10.4.4. 使用原生SQL的查询 10.5. 修改...

    Hibernate 课件及源代码

    内容涵盖安装 Hibernatetools 插件、Session 核心方法、持久化对象生命周期、对象关系映射(1-n、1-1、n-n、继承映射)、检索策略、检索方式(对象导航图、OID 检索、HQL、QBC、本地SQL)、Hibernate 一\二级缓存、...

    Hibernate 中文API文档

    Hibernate不仅仅管理Java类到数据库表的映射(包括Java数据类型到SQL数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。 Hibernate的目标是对于开发者...

Global site tag (gtag.js) - Google Analytics