如何解决 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自动更新实体类的问题,关键在于理解和控制Hibernate的生命周期、持久化状态以及事务管理。通过调整配置、使用特定的API和理解事务隔离级别,我们可以有效地防止或控制自动更新行为,确保...
在Java的持久化框架Hibernate中,自动更新实体类的问题是一个常见的困扰开发者的问题。当实体类的状态发生改变,Hibernate默认会尝试将这些变化同步到数据库,这在某些情况下并不符合我们的需求。本文将深入探讨这个...
然而,在实际开发过程中,我们可能会遇到一些问题,比如在处理`hbm.xml`文件中的中文注释时出现乱码,或者希望自动生成的实体类中包含有详细的注释。本文将详细介绍如何利用`Hibernate-tools`来解决这些问题,以`...
总的来说,"Hibernate实体类生成器mysql版"是Java开发中的得力助手,它利用FreeMarker和Swing的优势,提供了便捷、高效的实体类代码生成解决方案,使开发者能够将更多精力集中在业务逻辑的实现上,从而提升整体项目...
6. **生成数据库表**:使用Hibernate的工具,如`hbm2ddl.auto`配置,可以设置为`create`或`update`,在应用启动时自动根据实体类生成或更新数据库表。 7. **编写业务逻辑**:在Service层实现业务逻辑,通过...
为了解决这个问题,Java提供了一种机制,即自动生成实体类源代码,这大大提升了开发效率和代码质量。 1. **Java自动生成实体类工具**: - MyBatis-Plus:MyBatis的扩展工具,提供了实体类、Mapper接口、Mapper XML...
以上就是关于"解决Hibernate对于Date类型的数据返回结果中时分秒不对的问题"的详细分析和解决方案。在实际开发中,我们需要结合具体情况进行调整,确保日期时间数据的准确无误。对于提供的文件名"org",可能指的是...
如果想让Hibernate自动创建或更新数据库结构,包括索引,我们需要将这个属性设置为"create"、"create-drop"或者"update"。 但是,即使设置了正确的`hibernate.hbm2ddl.auto`,依然可能出现不自动创建索引的情况。这...
"多数据库支持、自动生成实体类和SQL语句的工具1.3.2版"正是这样一个高效实用的解决方案,它能够帮助开发者在多个数据库平台上快速构建和管理数据库模型。 首先,让我们来了解一下多数据库支持的概念。这意味着该...
此时,MyEclipse将自动为所选表生成对应的Hibernate配置文件,包括实体类映射文件(`.hbm.xml`)以及核心的`hibernate.cfg.xml`文件。 #### 三、自动生成配置文件的优势 1. **节省时间**:自动化的配置生成大大...
JavaMysql实体类自动生成工具就是为了解决开发者手动编写这些实体类的繁琐工作。 首先,让我们深入理解什么是Java实体类。在Java中,实体类通常是POJO(Plain Old Java Object)类,不包含任何特定框架的逻辑,只...
`java生成mysql实体类`这个主题涉及到了如何利用Java程序自动化地从MySQL数据库中获取表结构,并基于这些信息自动生成对应的实体类。下面我们将详细探讨这一过程。 首先,我们需要了解如何连接到MySQL数据库。在...
产生原因:因为使用 jpa 自动创建表的时候,采用的是TreeMap的,我们要变成LinkedHashMap ...解决方案:在项目下java文件夹下创建包名为: org.hibernate.cfg ,创建类: PropertyContainer [包名,类名一定要相同哦]
### Hibernate常见错误及解决办法 #### 一、Nodefaultconstructorforentity 错误 **问题描述**:在使用...通过以上分析和解决方案,可以有效地解决Hibernate开发过程中常见的错误,提高开发效率和系统的稳定性。
这个"JAVA 动态生成实体类.rar"文件可能包含了一个基于MVC(Model-View-Controller)架构的解决方案,它允许开发者通过输入数据库的相关信息(如数据库名、密码和表名),自动生成对应的Java实体类。 首先,让我们...
- 为了解决手动创建实体类和DTO的繁琐工作,存在一些工具能够自动生成这些类。这类工具可以根据数据库的元数据,如表结构和字段信息,自动生成对应的Java源代码。 - 使用这些工具,开发者只需要配置数据库连接信息...
为了解决这一问题,两个工具——hibernate-extensions和Middlegen-Hibernate应运而生,它们可以自动生成这些代码,提高了开发效率。 **hibernate-extensions** 是Hibernate框架的一个扩展,它提供了一些额外的功能...
【Hibernate更新问题详解】 Hibernate,一个强大的Java对象关系映射(ORM)框架,极大地简化了数据库操作。在处理数据更新时,Hibernate提供了多种方法,但同时也可能会遇到一些常见问题。本篇文章将深入探讨...
在Hibernate中,我们可以通过配置实体类的属性来实现时间戳的自动化管理。具体来说,可以添加一个类型为`java.util.Date`或`java.time.LocalDateTime`的字段,然后使用`@Temporal(TemporalType.TIMESTAMP)`注解...