161121、hibernate导致数据出错的两个地方
一、在查询出来的对象上直接设置属性(该属性配置了可以持久化,如果不是可持久化的就没有关系)。
出错的代码:(查询用的不好也会导致数据更新哦)
Pagination pagination = groupJoinService.findByEg(groupJoin, true, cond, Pagination.cpn(pageNo),FrontUtils.pageSize(pageSize));//这是一个分页查询的方法使用hibernate的Criteria,最底下有代码
List<GroupJoin> list = (List<GroupJoin>) pagination.getList();
if(null != list && list.size()>0){
for(GroupJoin bean:list){
if(null == bean.getPersons()){
Integer curPersons = groupStartService.getCurPersons(bean.getStartId());
bean.setPersons(curPersons);//这时候数据库中的这个对象数据有可能会变
if(curPersons >= minPersonOne){
bean.setStatus(GroupJoin.STATUS_CAN);
}else{
bean.setStatus(GroupJoin.STATUS_NO);
}
}else{
bean.setStatus(GroupJoin.STATUS_YES);
}
}
}
pagination.setList(list);
正确的代码:
Pagination pagination = groupJoinService.findByEg(groupJoin, true, cond, Pagination.cpn(pageNo),FrontUtils.pageSize(pageSize));
List<GroupJoin> gjs = new ArrayList<GroupJoin>();//重新new一个对象
List<GroupJoin> list = (List<GroupJoin>) pagination.getList();
if(null != list && list.size()>0){
for(GroupJoin bean:list){
if(null == bean.getPersons()){
Integer curPersons = groupStartService.getCurPersons(bean.getStartId());
bean.setPersons(curPersons);
if(curPersons >= minPersonOne){
bean.setStatus(GroupJoin.STATUS_CAN);
}else{
bean.setStatus(GroupJoin.STATUS_NO);
}
}else{
bean.setStatus(GroupJoin.STATUS_YES);
}
gjs.add(bean);//然后添加进去
}
}
pagination.setList(gjs);
二、设置主键生成方式时自己设置的id会被忽略掉(数据库mysql,持久层框架mysql)
将主键的生成方式设置成了identity,导致了自己设置了id会被忽略,最终使用数据库的自增长主键。
下面是代码及错误的xxx.hbm.xml配置
java代码:(service层中)
@Override
public User initUser(String openId,String nickname,String headimgurl,String address,String sex,String access_token,String refresh_token
,String expires_in,String state) throws Exception {
User user = findByOpenid(openId);
boolean isSellerUrl = FrontUtils.isSellerUrl(state);
if(null == user){
user = new User();
user.setOpenId(openId);
user.setAddTime(new Date());
user.setStatus(Integer.valueOf(1));
user.setAccessToken(access_token);
user.setRefreshToken(refresh_token);
user = save(user);
initUserDetail(user.getId(), headimgurl, nickname, address, openId, sex);//如果主键生成方式设置成了identity,就算你设置了id也会被忽略掉,直接使用数据库中自增长的id
if(isSellerUrl){//如果是商家链接初始化商家
initSeller(user.getId());
}
}else{
if(isSellerUrl){
Seller seller = sellerService.findById(user.getId());
if(null == seller){
initSeller(user.getId());
}
}
}
return user;
}
Seller.hbm.xml(问题出现在这里)
//省略
<hibernate-mapping package="com.sellers.entity">
<class name="Seller" table="sl_seller" dynamic-update="true">
<meta attribute="sync-DAO">false</meta>
<cache usage="read-write"/>
<id name="id" type="integer" column="id" ><generator class="identity"/></id>
//省略
修复后:<id name="id" type="integer" column="id" ><generator class="assigned"/></id>
上面实例查询的代码:
public Pagination findByEg(T eg, boolean anyWhere, Condition[] conds,
int page, int pageSize, String... exclude) {
Order[] orderArr = null;
Condition[] condArr = null;
if (conds != null && conds.length > 0) {
List<Order> orderList = new ArrayList<Order>();
List<Condition> condList = new ArrayList<Condition>();
for (Condition c : conds) {
if (c instanceof OrderBy) {
orderList.add(((OrderBy) c).getOrder());
} else {
condList.add(c);
}
}
orderArr = new Order[orderList.size()];
condArr = new Condition[condList.size()];
orderArr = orderList.toArray(orderArr);
condArr = condList.toArray(condArr);
}
Criteria crit = getCritByEg(eg, anyWhere, condArr, exclude);
return findByCriteria(crit, page, pageSize, null, orderArr);
}
@SuppressWarnings("rawtypes")
protected Pagination findByCriteria(Criteria crit, int pageNo,
int pageSize, Projection projection, Order... orders) {
int totalCount = ((Number) crit.setProjection(Projections.rowCount()).uniqueResult()).intValue();
Pagination p = new Pagination(pageNo, pageSize, totalCount);
if (totalCount < 1) {
p.setList(new ArrayList());
return p;
}
crit.setProjection(projection);
if (projection == null) {
crit.setResultTransformer(Criteria.ROOT_ENTITY);
}
if (orders != null) {
for (Order order : orders) {
crit.addOrder(order);
}
}
crit.setFirstResult(p.getFirstResult());
crit.setMaxResults(p.getPageSize());
p.setList(crit.list());
return p;
}
161121、hibernate导致数据出错的两个地方的更多相关文章
- jmeter随笔(9)--有两种编码风格,导致数据乱码
问题:在一个网站,有两种编码风格,导致数据乱码 解决办法: 1.首先设置jmeter的配置文件 2.针对要求是utf-8格式的这样的请求,做单独的编码处理(beanshell处理) 3.运行,在htm ...
- Hibernate在PostgreSQL上执行sum函数导致数据失真的问题
有一段通过Hibernate从PostgreSQL上进行sum统计的简单代码,但统计结果却导致数据失真,不知原因何在,求指教! Java代码片段如下: public List<Object> ...
- Hibernate的数据查找,添加!
1.首先看一下测试数据库的物理模型 2.测试所需要的Hibernate的jar包 3.数据库的sql /*=============================================== ...
- Struts2中validate数据校验的两种常用方法
本文主要介绍Struts2中validate数据校验的两种方法及Struts2常用校验器. 1.Action中的validate()方法 Struts2提供了一个Validateable接口,这个接 ...
- 【Spark调优】大表join大表,少数key导致数据倾斜解决方案
[使用场景] 两个RDD进行join的时候,如果数据量都比较大,那么此时可以sample看下两个RDD中的key分布情况.如果出现数据倾斜,是因为其中某一个RDD中的少数几个key的数据量过大,而另一 ...
- hibernate实现数据实体复制保存
hibernate实现数据实体复制保存 2013年12月16日 11:57:22 Hardy008 阅读数:3474 描述:需要将数据的一条记录进行复制保存为一条新记录. 思路:从数据库中取得一条 ...
- pt-osc改表导致数据不一致案例分析
2016-06-10 李丹 dba流浪猫 我们平时除了解决自己问题外,有时候也会协助圈内人士,进行一些故障排查,此案例就是帮某公司DBA进行的故障分析,因为比较典型,特分享一下,但仅仅是分享发生的过程 ...
- Spark-5-如何定位导致数据倾斜的代码
数据倾斜只会发生在shuffle过程中.这里给大家罗列一些常用的并且可能会触发shuffle操作的算子:distinct.groupByKey.reduceByKey.aggregateByKey.j ...
- ubuntu server 12.04U盘安装,提示无法挂载安装光盘或光盘读取数据出错
今天用Ultraiso将Ubuntu server 12.04 刻入U盘中安装系统,中间提示错误:1.检测不到cdrom(即U盘没有挂载上):2.从光盘中读取数据出错.问题如下图所示: 上网搜了下解决 ...
随机推荐
- logback的配置和使用
1. logback介绍 logback是由log4j创始人设计的又一个开源日志组件.logback当前分成三个模块:logback-core,logback-classic和logback-acce ...
- 发送xml或json格式的数据给服务器
后台通过context.Request.InputStream来接收 #region 发送消息 + void SendMessage() /// <summary> /// 发送消息 // ...
- C语言深度剖析学习错误点记录
0. static修饰变量和函数 static修饰变量,1)限定作用域,本文件内.全局变量(自定义起,本文件前面要用需extern声明),局部变量函数内:2)生命周期,程序运行期间一直保存. stat ...
- WebDriver中启动不同的浏览器
import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.firefox.FirefoxDriver; im ...
- 一个WebService Demo
1.建立一个Asp.net Web网站,添加新项Web服务MyMath.asmx.编写如下代码: using System; using System.Collections.Generic; usi ...
- Vue.2.0.5-Render 函数
基础 Vue 推荐使用在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编程的能力,这就是 render 函数,它比 templa ...
- session的方法
Hibernate对象的状态 瞬时(Transient) — 由 new 操作符创建,且尚未与Hibernate Session 关联的对象被认定为瞬时(Transient)的.瞬时(Transien ...
- javaEE开发案例——购物车
一.页面 流程:登录页面(login.jsp)——>购物大厅页面(hall.jsp)——>购物车页面(showMyCart.jsp)——>订单页面(myorder.jsp)——> ...
- RAC数据库迁移ASM磁盘组到其它存储
环境介绍: 一共有两个磁盘组:crs和data:crs使用normal冗余:data使用外部冗余. 添加新的asm磁盘过程(略) 1.迁移前 SQL> select group_number, ...
- C# 以管理员方式启动Winform,进而使用管理员控制Windows Service
问题起因: 1,) 问题自动分析Windows服务在正常运行时,确实会存在程序及人为原因导致该服务停止.为了在应用程序使用时确保该服务正常运行,于是有了该讨论主题. 2,)一般账户(尽管是管理员组账户 ...