如何解决 hibernate 自动更新实体类的问题
示例:
GrabOrder grabOrder = (GrabOrder)this.grabOrderDao.getCurrentSession().get(GrabOrder.class,grabOrderId); grabOrder.setNickname(TimeHWUtil.getCurrentDateTime());
上述代码 会执行两条SQL:
查询和更新
为什么会更新呢?我明明没有调用DAO的update方法啊!!!
但是这里我调用了实体类的setter方法,
hibernate有一个机制:Hibernate dirty-checks,会同步session缓存和数据库的数据.
如何解决 自动更新的问题:
方案一:把实体类由持久态变为脱管态(游离态)
this.grabOrderDao.getCurrentSession().evict(grabOrder);
缺点:懒加载的对象无法加载,因为此时session相当于close了
而且会报错:org.hibernate.LazyInitializationException: could not initialize proxy - no Session
报错的代码:
this.grabOrderDao.getCurrentSession().clear(); System.out.println(grabOrder.getHouseInfo().getHouseOwner().getId());
更好的操作步骤:
(1)先把要访问的属性加载出来,可以通过提前使用,或者Hibernate.initialize(dept)
(2)再调用evict方法或clear方法
什么叫提前使用呢?即提前调用getter方法
正确:
System.out.println(grabOrder.getHouseInfo().getHouseOwner().getId()); this.grabOrderDao.getCurrentSession().clear(); System.out.println(grabOrder.getHouseInfo().getHouseOwner().getId());
方案二:把实体类变为只读
this.grabOrderDao.setReadOnly(grabOrder, readonly);
但是这招不是万灵药,有例外,看官网:
12.2.2.2. Unidirectional one-to-many and many-to-many
Hibernate treats unidirectional one-to-many and many-to-many associations owned by a read-only entity the same as when owned by an entity that is not read-only.
修改 单向的一对多和多对多的成员变量时,依然会触发hibernate的自动更新.
有什么万全之策呢?
(a)采用读写分离,把操作放在只读的数据库连接中
(b)采用只读事务
当方法名是updateTestLazy 时会自动更新
但是我修改方法名为getTestLazy时,就不会自动更新了
为什么呢?看看spring 事务配置
只读的对象 不保险,所以我们使用只读的事务或只读的数据库连接.
如何解决 json序列化时,自动加载lazy对象导致对象多层嵌套的问题?
使用 SimpleBeanPropertyFilter过滤不需要的字段
/*** * * @param xpath : 参考 com/kunlunsoft/util/objectxpath/ObjectXpath.java * @return */ public String toJson(String column, String... xpath) { if (this.result == null) {//modified by huangweii @2015-08-17 System.out.println("this.result is null"); } else { if (this.result != false) { // this.errorMessage = null; this.setErrorMessage(null); } } if (ValueWidget.isNullOrEmpty(xpath) || ValueWidget.isNullOrEmpty(xpath[0])) { return HWJacksonUtils.getJsonP(this); } // final ObjectXpath oxp = new ObjectXpath(); int length = xpath.length; // final Object[] filterObjects = new Object[length]; List filterObjList = new ArrayList(); for (int i = 0; i < length; i++) { Object o = XPathParser.process(this.getValue(), xpath[i]); if (o instanceof List) { filterObjList.addAll((List) o); } else { filterObjList.add(o); } // filterObjects[i] = o; } final Object[] filterObjects = filterObjList.toArray(); return HWJacksonUtils.getJsonP(this, new DefaultJsonFilterDecide() { @Override public boolean isFilteColumn(Object pojo, Object propertyVal, String column2) { if (ValueWidget.isNullOrEmpty(column)) { if (SystemHWUtil.isEquals(propertyVal, filterObjects)) { return true; } } else { if (SystemHWUtil.isEquals(pojo, filterObjects) && (column2.equals(column))) { return true; } } return false; } }); }
相关推荐
如何解决hibernate自动更新实体类的问题共5页.pdf.zip
如何解决hibernate自动更新实体类的问题共5页.pdf.zip
产生原因:因为使用 jpa 自动创建表的时候,采用的是TreeMap的,我们要变成LinkedHashMap ...解决方案:在项目下java文件夹下创建包名为: org.hibernate.cfg ,创建类: PropertyContainer [包名,类名一定要相同哦]
Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复...
第一章 安装配置开发环境 18 1.1系统需求 18 1.2 JDK 的下载,安装和配置(可...10.7.2 MyEclipse生成的Spring+Hibernate无法保存数据问题的解决方法2 - 用 CGLIB 来实现事务管理 258 10.7.3 Spring相关的参考资料 261
用于提供接口信息,和一些共同的实体类 常见的 为提供一些公共库 闸门 网关,分配路由,用于调用管理类的控制层,无需关注端口,路由分配转发 xc-ui 后台页面,使用 react技术开发 增加mybatis多数据源操作,引用...
答:接口可以继承接口,抽象类可以实现接口,抽象类可以继承实体类。 引用传递和值传递? 答:引用传递:形参改变影响实参 值传递:形参改变不影响实参 当一个线程进入一个对象的synchronized方法后,其他线程是否...
124.hibernate 实体类必须要有无参构造函数吗?为什么? 十三、Mybatis 125.mybatis 中 #{}和 ${}的区别是什么? 126.mybatis 有几种分页方式? 127.RowBounds 是一次性查询全部结果吗?为什么? 128.mybatis 逻辑...
数据模型架构数据模型的体系结构相对简单,它的生成是由hibernate根据以下数据模型自动执行的: 有一个主要实体可以包含以下方面: 实体的位置(例如,Aveiro); 实体名称; 邮政编码; 地址地址; 完整地址; 门牌...
Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复...
AOP 和 IOC 是补充性的技术,它们都运用模块化方式解决企业应用程序开发中的复杂问题。在典型的面向对象开发方式中,可能要将日志记录语句放在所有方法和 Java 类中才能实现日志功能。在 AOP 方式中,可以反过来将...
(E-SQL) E-SQL不但解决了异构数据库的语法问题、函数问题、特殊的写法问题,还解决了动态SQL问题、绑定变量扩展等特性。 对于各种常用SQL函数和运算符,都可以自动转换为当前数据库支持的方言来操作。其函数支持也要...
解决自动配置问题 ii. 62.2. 启动前自定义Environment或ApplicationContext iii. 62.3. 构建ApplicationContext层次结构(添加父或根上下文 iv. 62.4. 创建一个非web(non-web)应用 ii. 63. 属性&配置 i. 63.1. ...
用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,...
Java目录监视器源程序 9个目标文件 内容索引:JAVA源码,综合应用,目录监视 用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。...