首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Hibernate session.getTransaction().commit()如何在不调用getter的情况下知道私有字段的变化?

在Hibernate中,通过调用session的getTransaction()方法返回Transaction对象,然后调用其commit()方法可以提交事务。在执行commit()方法之前,Hibernate会检查当前事务中的所有持久化对象,找出发生变化的字段,然后执行相应的SQL语句将变化持久化到数据库中。

在不调用getter方法的情况下,Hibernate可以通过跟踪字段的改变状态来知道私有字段的变化。它使用了一种称为“脏检查(dirty checking)”的机制。当对象被加载到session中时,Hibernate会将该对象的字段值与数据库中的对应字段进行比较,如果发现不一致,则认为该字段发生了变化。在执行commit()方法时,Hibernate会检查所有处于持久化状态的对象,找出所有发生了变化的字段,并生成相应的更新语句。

通过脏检查机制,Hibernate避免了需要显式调用getter方法来比较字段值的情况,从而提高了性能和效率。

需要注意的是,在使用脏检查机制时,私有字段必须具有公共的setter和getter方法,以便Hibernate可以通过反射机制来访问和修改字段的值。否则,Hibernate无法感知到字段值的变化。

推荐的腾讯云产品:腾讯云数据库TencentDB、腾讯云云服务器CVM。

腾讯云数据库TencentDB:https://cloud.tencent.com/product/tencentdb

腾讯云云服务器CVM:https://cloud.tencent.com/product/cvm

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【SSH快速进阶】——Hibernate继承映射:每棵继承树映射一张表

https://blog.csdn.net/huyuyang6688/article/details/50680899   我们都知道Hibernate最大一个优点就是使开发更加“面向对象...”,类与类之间有继承关系,Hibernate中也对这种继承关系提供了映射封装。   ...  配置映射文件时,父类还用标签来定义即可;添加区分字段(比如上面表1中Type字段)需要用标签来定义;用标签定义两个子类,与父类“合并...(Animal.class, 1); System.out.println(pig.getName()); session.getTransaction().commit();   执行结果都为: 小猪猪...().commit(); 总结   这种映射方式可以把多个类放在一张表中,但是粒度比较粗,有冗余字段;但又是因为多个类相关记录都存放在一张表中,查询时不用关联,因此效率较高。

39120
  • day31_Hibernate学习笔记_03

    值为 subselect 时,注意:该属性值,在一次加载多个客户订单数据情况下才有效     // 结果:会在使用集合(订单)时才加载,子查询语句,如果你使用集合只是为了获取集合长度,则Hibernate...法二:因为是在Service层调用Dao层方法,那么我们在Service层就知道以后我们在页面上要用数据,所以我们在Seesion关闭之前,在Service层先getXxx()在页面要上要用到属性...与SQL语法基本一致,不同是HQL是面向对象查询,查询是对象和对象中属性。 HQL关键字区分大小写,但是类名和属性名区分大小写。...乐观锁(需要自己实现,但Hibernate帮我们实现了,我们只需配置一下就可以使用了): 乐观锁:丢失更新肯定不会发生。 在表中提供一个字段(版本字段),用于标识记录。如果版本不一致,不允许操作。...().commit();         session.close();     } } 乐观锁示例代码: 在PO对象(JavaBean)中提供字段,表示版本字段

    2.5K40

    day30_Hibernate学习笔记_02

    值,将ID值加1作为新主键,建议使用,存在线程并发问题         // assigned  => 需要手动指定主键,手动指定将会报错         session.getTransaction...//       持久化状态特点:Hibernate会自动将持久化状态对象变化同步到数据库中。     ...session.update(u);      // 多余代码  => 因为Hibernate会自动将持久化状态对象变化同步(更新)到数据库中。         ...Session一级缓存中,但是为什么每次调用Hql查询都会生成Sql语句呢?...多对多:提供中间表(从表),提供2个字段(外键)分别对应两个主表。 一对一:非常少见。 如何使用面向对象思想通过代码描述对象与对象之间关系?

    99520

    Hibernate学习笔记 单表映射

    建立实体类 配置好SessionFactory之后,我们就可以开始建立一对一单表映射了。首先需要建立一个实体类,这里Getter、Setter、toString、equals等方法省略了。...默认情况下表名和实体类名相同,如果希望自定义表名使用Table注解并设置相应name属性。 Id注解标明了主键。...NaturalId指定实体类自然主键。一般情况下推荐使用无意义数字作为主键,但是有时候类似于用户名、书籍编号这样属性也具有主键意义。这时候我们将这些属性定义为自然主键。...注解即可以放在字段上,也可以放在方法上。如果放在字段上,Hibernate就会使用字段对数据进行操作。如果放在方法上,Hibernate就使用方法操作数据。...不论哪种都是可以,但是需要注意保持一致性,不能混用。Hibernate检索依据是Id注解位置,如果Id放在了方法上而其他注解放在了字段上,Hibernate就会忽略字段所有注解,反之亦然。

    35220

    hibernate框架中对象状态

    ().commit(); session.close(); 控制台打印: ----------------- Hibernate: insert into t_user (...-----"); session.getTransaction().commit(); System.out.println("-------------------"); 控制台打印: -...().commit(); System.out.println("-------------------"); 控制台打印: Hibernate: select user0_....情况1)调用save方法把临时状态变为持久状态 情况2)调用save方法把游离托管状态状态变为持久对象 保存一个对象之后,提交事务/关闭Session,此时对象处于游离状态, 再创建新Session...session中方法仅仅是改变对象状态,不发SQL: 3: 持久化对象属性真正发生改变时,才会发生UPDAE语句. ---- 发生SQL时机: 默认情况下,在事务提交时,会自动去数据库同步这一次对象变化对应

    84820

    注解方式实现级联

    一般情况下,我们只会用到前两种情况,多对多用较少。我这里使用省市区三级联查来实现级联操作。简单来说,一对多就是一个省下面有多个市,一个市下面有多个县。多对一是刚好反过来。...首先是使用配置文件情况下,关联类,生成hbm.xml文件中显示如下: <class name="com.qy.domain.Province" table...-- name:当前类属性名 column:从表中外键名 foreign-key:主表中被参照字段 property-ref:主表中被参照字段属性名...注意: (1):如果实体类属性名与表字段名不一致时候,要么都注解在属性前,要么都注解在get方法前。不能部分注解在属性前,部分注解在方法前。...(2):如果实体类属性名与表字段名一致时候,可以部分注解在属性前,部分注解在方法前。 (3):如果在实体类中某些属性注解:(属性和get都不写注解),默认为表字段名与实体类属性名一致。

    63420

    菜鸟学SSH(十八)——Hibernate动态模型+JRebel实现动态创建表

    就打算让用户自己配置要加入字段,然后生成相应表。 须要动态配置部分实例: 上图仅仅是一小部分,一个一个组合起来大概有三百多。每一项相应一个实体,显然不好,就算是依照规律归归类还是有不少。...后来决定用Hibernate动态模型来处理这个问题,可能有的人不是非常了解Hibernate动态模型,以下我们就来介绍一下。 我们通经常使用实体类来跟表进行映射。...String password; // setter、getter... } 然后用配置文件或注解来描写叙述映射关系,假设使用动态模型的话,则不须要编写实体类,仅仅须要写一个配置文件就可以...().commit(); session.close(); 发出SQL语句:insert into User (name, password) values (?...就是为了兼容执行期生成动态模型配置文件,而JRebel能够检測到配置文件变化,从而将新增配置载入进来。

    54810

    Hibernate【映射】续篇

    -- 映射普通字段 父类属性直接引用就行了,比如name属性,直接写就行了!...(); session.save(cat); //如果取数据时候Animal父类接收的话,需要给出Anmail全名 //提交事务 transaction.commit();...鉴别器字段:作用是在数据库中区别每一个子类信息, 就是一个列 discriminator-value="cat_" 指定鉴别器字段,即type_字段值 如果指定,默认为当前子类全名 --...-- Animal下子类映射成一张表 指定子类类型,对应表 指定子类外键字段【需要对应Animal】 指定子类普通属性 --> <joined-subclass name="Cat...-- 将子类<em>的</em>信息都映射成一张表 给出属性<em>的</em>名称 属性对应<em>的</em>数据库表 普通<em>字段</em> --> <property

    76860

    Hibernate入门这一篇就够了

    一般它和JavaBean对象放在同一目录下 我们是不知道该XML是怎么写,可以搜索一下Hibernate文件夹中后缀为.hbm.xml。看看它们是怎么写。然后复制一份过来 ? 这里写图片描述 <?...我们来使用一下update()方法吧….既然是更新操作了,那么肯定需要设置主键设置主键,数据库怎么知道你要更新什么。...当调用sesisonFactoryclose方法时候,删除表!...常用属性: name 指定对象属性名称 column 指定对象属性对应字段名称 如果写默认与对象属性一致。...length 指定字符长度, 默认为255 type 指定映射表字段类型,如果指定会匹配属性类型 **java类型: 必须写全名【例:java.lang.String】 ** **

    1.6K40

    走进JavaWeb技术世界13:Hibernate入门经典与注解式开发

    一般它和JavaBean对象放在同一目录下 我们是不知道该XML是怎么写,可以搜索一下Hibernate文件夹中后缀为.hbm.xml。看看它们是怎么写。然后复制一份过来 <?...XML配置文件来配置相对应信息 configure方法 configure()方法用于加载配置文件 加载主配置文件方法 如果指定参数,那么加载参数路径配置文件 如果指定参数,默认加载src/目录下...我们来使用一下update()方法吧....既然是更新操作了,那么肯定需要设置主键设置主键,数据库怎么知道你要更新什么。...SQL:Struct query language 结构化查询语言 查询是表以及列【区分大小写】 HQL是面向对象查询语言,可以用来查询全部数据!...@Column(name="c_name", length=30, nullable=true) private String name; 注意:对于PO类中所有属性,如果你写注解,默认情况下也会在表中生成对应

    1.8K00

    hibernate笔记(二)

    -- set集合属性映射 name 指定要映射set集合属性 table 集合属性要映射到表 key 指定集合表(t_address)外键字段 element 指定集合表其他字段 type...().commit(); session.close(); } 问题: 集合映射,映射集合元素,都是普通类型, 能否为对象类型?...session.save(emp_zs); session.save(emp_ls);// 再保存多一方,关系回自动维护(映射配置完) session.getTransaction().commit...cascade 属性 cascade 表示级联操作 【可以设置到一一方或多一方】 none 级联操作, 默认值 save-update 级联保存或更新 delete...映射集合属性: “developers” 2. 集合属性,对应中间表: “t_relation” 3. 外键字段: prjId 4. 外键字段,对应中间表字段: did 5.

    54210

    hibernate一级缓存

    理解 Hibernate 一级缓存 Hibernate 一级缓存默认是打开,不需要任何配置。实际上,你无法强制禁止它使用。 如果你理解了一级缓存实际上和会话是关联,就很容易理解一级缓存。...相似的,一级缓存与会话对象相关联,在会话存活期间是可用。相同应用中不同会话是无法相互访问。 重点 一级缓存和会话相关联,应用中会话无法知道其他会话中缓存 缓存范围是在会话范围内。...如果实体已经使用 evict 下次加载该实体将会再次调用数据库查询 整个会话缓存可以通过 clear() 方法移除。...().commit(); HibernateUtil.shutdown(); Output: Hibernate: select department0_.ID as ID0_0_, department0...().commit(); HibernateUtil.shutdown(); } Output: Hibernate: select department0_

    93010

    走进JavaWeb技术世界13:Hibernate入门经典与注解式开发

    一般它和JavaBean对象放在同一目录下 我们是不知道该XML是怎么写,可以搜索一下Hibernate文件夹中后缀为.hbm.xml。看看它们是怎么写。然后复制一份过来 <?...XML配置文件来配置相对应信息 configure方法 configure()方法用于加载配置文件 加载主配置文件方法 如果指定参数,那么加载参数路径配置文件 如果指定参数,默认加载src/目录下...我们来使用一下update()方法吧....既然是更新操作了,那么肯定需要设置主键设置主键,数据库怎么知道你要更新什么。...SQL:Struct query language 结构化查询语言 查询是表以及列【区分大小写】 HQL是面向对象查询语言,可以用来查询全部数据!...@Column(name="c_name", length=30, nullable=true) private String name; 注意:对于PO类中所有属性,如果你写注解,默认情况下也会在表中生成对应

    1.8K10
    领券