Hibernate瞬时态_持久太_游离态

2024-08-22 21:08

本文主要是介绍Hibernate瞬时态_持久太_游离态,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

总结一个多年以前自己犯的错误,就是Hibernate持久化状态下,查出来的数据,只要set过修改过数据之后, 不用save也会自动更新.

@Service
@Slf4j
public class DemoEntityServiceImpl implements DemoEntityService {@ResourceDemoEntityRepository demoEntityRepository ;@Overridepublic void testNoHaveSaveButSaveSuccess() {DemoEntity demoEntity =demoEntityRepository.findOne(1L);
demoEntity.setBalance(12L);
demoEntity.setName("张宇晋"); //观察到下面没有save方法,但是这里实实在在显示到数据库中去了DemoEntity copy = demoEntity ;
copy.setName("copyEntity"); //最终数据id为1的数据库中 name为 copyEntity ,因为是浅复制DemoEntity demoEntityT = new DemoEntity();
demoEntityT.setName("z1");
demoEntityRepository.save(demoEntityT);demoEntityT.setBalance(12L); //会对上面的进行更新}
}

解释:

1.瞬态:

一个实体通过new操作符创建后,没有和Hibernate的Session建立关系,也没有手动赋值过该实体的持久化
标识(持久化标识可以认为是映射表的主键)。
此时该实体中任何属性的更新都不会反映到数据库表中。

2.持久化:

当一个实体和Hibernate的Session创建了关系,并获取了持久化标识,而且在Hibernate的Session生命周期内
存在。
此时针对该实体任何属性的更改都会直接影响到数据库表中一条记录对应字段的更新,即与数据库表同步。

3.脱管:

当一个实体和Hibernate的Session创建了关系,并获取了持久化标识,而此时Hibernate的Session生命周期结
束,实体的持久化标识没有被改动过。
针对该实体任何属性的修改都不会及时反映到数据库表中。

解决方案

如果我们只是想使用这个查出来的实体,并且在某种情况下,如果需要里面的值,并且要对它进行暂时的修改,却不是修改之后要保存到数据库中

情景:淘宝的appkey和appSecret保存了,默认给提供一些渠道数据,当定时器在修改某个商品的渠道的时候,淘宝信息是我们需要的,但是它提供的渠道却不是我们需要的,所以时候是要set渠道一下一下。

1、重新new一个出来

BeanUtils.copyProperties(, );或者下面的public static TaobaoUserInfo getNewTaobaoUserInfo(TaobaoUserInfo source){TaobaoUserInfo target = new TaobaoUserInfo();target.setId(source.getId());target.setCouponAdzoneId(source.getCouponAdzoneId());target.setUserId(source.getUserId())

这篇关于Hibernate瞬时态_持久太_游离态的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1097395

相关文章

java面试常见问题之Hibernate总结

1  Hibernate的检索方式 Ø  导航对象图检索(根据已经加载的对象,导航到其他对象。) Ø  OID检索(按照对象的OID来检索对象。) Ø  HQL检索(使用面向对象的HQL查询语言。) Ø  QBC检索(使用QBC(Qurey By Criteria)API来检索对象。 QBC/QBE离线/在线) Ø  本地SQL检索(使用本地数据库的SQL查询语句。) 包括Hibern

org.hibernate.hql.ast.QuerySyntaxException:is not mapped 异常总结

org.hibernate.hql.ast.QuerySyntaxException: User is not mapped [select u from User u where u.userName=:userName and u.password=:password] 上面的异常的抛出主要有几个方面:1、最容易想到的,就是你的from是实体类而不是表名,这个应该大家都知道,注意

Caused by: org.hibernate.MappingException: Could not determine type for: org.cgh.ssh.pojo.GoodsType,

MappingException:这个主要是类映射上的异常,Could not determine type for: org.cgh.ssh.pojo.GoodsType,这句话表示GoodsType这个类没有被映射到

Hibernate框架中,使用JDBC语法

/*** 调用存储过程* * @param PRONAME* @return*/public CallableStatement citePro(final String PRONAME){Session session = getCurrentSession();CallableStatement pro = session.doReturningWork(new ReturningWork<C

hibernate修改数据库已有的对象【简化操作】

陈科肇 直接上代码: /*** 更新新的数据并并未修改旧的数据* @param oldEntity 数据库存在的实体* @param newEntity 更改后的实体* @throws IllegalAccessException * @throws IllegalArgumentException */public void updateNew(T oldEntity,T newEntity

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(4)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(3)-CSDN博客  这节就是真正的存储数据了   理清一下思路: 1.存储路径并检查 //2进制文件类存储private static string Data_Binary_Pa

Hibernate插入数据时,报错:org.springframework.dao.DataIntegrityViolationException: could not insert: [cn.itc

在用junit测试:插入数据时,报一下错误: 错误原因: package junit;import org.junit.Test;import cn.itcast.crm.container.ServiceProvinder;import cn.itcast.crm.dao.ISysUserDao;import cn.itcast.crm.domain.SysRole;

Hibernate中自带的连接池!!!

<span style="font-size:18px; font-family: Arial, Helvetica, sans-serif;"><?xml version="1.0" encoding="UTF-8"?></span> <span style="font-size:18px;"><!DOCTYPE hibernate-configuration PUBLIC"-//Hibern

iptables持久化命令:netfilter-persistent save

在Linux上,使用netfilter-persistent命令可以保存iptables防火墙规则,确保它们在系统重启后仍然有效。以下是如何使用netfilter-persistent来保存iptables规则的步骤: 打开终端:首先,你需要打开Linux系统的终端。保存规则:使用netfilter-persistent save命令可以保存当前的iptables规则。这个命令会调用所有插件,将

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(3)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(2) (*****生成数据结构类的方式特别有趣****)-CSDN博客 做完了数据结构类,该做一个存储类了,也就是生成一个字典类(只是声明)  实现和上一节的数据结构类的方式大同小异,所