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;

}

时间: 2024-12-15 01:34:33

161121、hibernate导致数据出错的两个地方的相关文章

因导致数据出错,百丽吧暂停QQ登录的功能,请使用本站账户名和密码登录,由此带来的不便我们深表歉意。

http://t.cn/RA9ALSNhttp://t.cn/RA9ALCyhttp://t.cn/RA9AL0xhttp://t.cn/RA97M8hhttp://t.cn/RA97V3xhttp://t.cn/RA9ALH2http://t.cn/RA9ALQIhttp://t.cn/RA9ALEFhttp://t.cn/RA9ALuthttp://t.cn/RA9AL31http://t.cn/RA9ALBYhttp://t.cn/RA9ALdbhttp://t.cn/RA9ALevhtt

mysqldump备份大数据出错

mysqldump备份大数据出错技术 maybe yes 发表于2015-01-26 22:58 原文链接 : http://blog.lmlphp.com/archives/72  来自 : LMLPHP后院 网 站的数据会定期备份,现在数据大了,mysqldump 方法估计是不行了,并且失败了以后并不能接着上次的位置开始备份.报错内容:mysqldump: Error 2013: Lost connection to MySQL server during query when dumpin

如何使用hibernate创建数据表

引言:使用连接数据库来创建实体类,很快就学会了,但是对于怎么用hibernate创建数据表确实用了两天的时间,记录下这次学习的过程. 1.在一开始怎么都搜不到资料,后来才明白,在搜的时候要加正向的,用数据库创建实体类是反向,用实体类创建数据表是正向的,这样搜就可以了 2.在一开始的时候,总是执着于IDE和插件的问题,对于所遇到的问题没有进行深入的研究,导致浪费掉了大量的时间(最后还是没搞定) 3.总是执着于教程上的操作方式,到最后才发现,在新版本里的写法是不一样的,坑之又坑 4.浪费时间最长的是

数据归一化的两种常用方法

数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性.原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价.以下是两种常用的归一化方法: 一.min-max标准化(Min-Max Normalization) 也称为离差标准化,是对原始数据的线性变换,使结果值映射到[0 - 1]之间.转换函数如下: 其中max为样本数据的最大

pt-osc改表导致数据不一致案例分析

2016-06-10 李丹 dba流浪猫 我们平时除了解决自己问题外,有时候也会协助圈内人士,进行一些故障排查,此案例就是帮某公司DBA进行的故障分析,因为比较典型,特分享一下,但仅仅是分享发生的过程,不对该案例的产生以及如何避免做过多评价! pt-online-schema-change:是对大表进行在线alter操作,并尽量避免影响线上业务,这是最优秀的mysql管理工作之一,在平时的工作中,帮助我们胜多. 环境说明 pt-osc 版本:percona-toolkit-2.2.14 mysq

Hibernate的数据查找,添加!

1.首先看一下测试数据库的物理模型 2.测试所需要的Hibernate的jar包 3.数据库的sql /*==============================================================*/ /* DBMS name: MySQL 5.0 */ /* Created on: 2015/7/3 23:17:57 */ /*==============================================================*/ dr

Notification(二)——PendingIntent的flag导致数据相同的问题

MainActivity如下: package cc.cu; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.app.Activity; import android.app.Notification; import android.app.NotificationMa

【ThinkPHP学习】ThinkPHP自动转义存储富文本编辑器内容导致读取出错

RT. ThinkPHP的conf文件中的Convention.php有一个配置选项 'DEFAULT_FILTER' => 'htmlspecialchars', // 默认参数过滤方法 用于I函数... 默认这个方法是开启的.也就是说,我们往数据库里面存储的数据中都会经过htmlspecialchars这个函数的转义处理. 我在我的项目中使用了Kindeditor富文本编辑器(或许你使用的是Ueditor\ckeditor),通过富文本编辑器编辑文章的内容然后存储到数据库中,再从数据库中读取

【Spark调优】大表join大表,少数key导致数据倾斜解决方案

[使用场景] 两个RDD进行join的时候,如果数据量都比较大,那么此时可以sample看下两个RDD中的key分布情况.如果出现数据倾斜,是因为其中某一个RDD中的少数几个key的数据量过大,而另一个RDD中的所有key都分布比较均匀,此时可以考虑采用本解决方案. [解决方案] 对有数据倾斜那个RDD,使用sample算子采样出一份样本,统计下每个key的数量,看看导致数据倾斜数据量最大的是哪几个key. 然后将这几个key对应的数据从原来的RDD中拆分出来,形成一个单独的RDD,并给每个ke