收藏私塾在线
 

欢迎您来到私塾在线网!   

请登录! 

免费注册 

交流首页 » 学习问题讨论 »根据这上面教程做增强UUID自动生成,遇到数据无法更新问题。  XML
发表人 内容
潜龙
[头像]

交流经验:
总积分:35429
级别:VIP5
注册时间: 2011-11-10
文章: 160
离线

与教程一样,uuid自动生成。

 

java代码:
@Transactional
public class UuideServiceEbo implements UuidServiceEbi {

	private UuidServiceDao uuidServiceDao = null;
	
	public void setUuidServiceDao(UuidServiceDao uuidServiceDao) {
		this.uuidServiceDao = uuidServiceDao;
	}
	
	private static Map<String, Integer> mapDB = null;
	private static Map<String, Integer> mapNow = new HashMap<String, Integer>();
	
	private void init(){
		//延迟初始化mapDB和mapNow
		if(mapDB == null){
			mapDB = new HashMap<String, Integer>();
			List<UuidModel> list = uuidServiceDao.getAll(new UuidQueryModel(), false, 0, 1);
			for(UuidModel um : list){
				mapDB.put(um.getPreKey(), um.getNum());
				mapNow.put(um.getPreKey(), um.getNum());
			}
		}
	}
	
	@Override
	public int getNextUuid(String preKey, int cacheNum) {
		// 延迟初始化
		this.init();
		//1 到mapNow去查找
		Object obj = mapNow.get(preKey);
		System.out.println("obj:"+obj);
		int nowNum = 0;
		if(obj != null){
			//2.如果存在,就取出来+1,并修改mapNow
			nowNum = (int) obj + 1;
			mapNow.put(preKey, nowNum);
			System.out.println("nowNum:"+nowNum+", get:"+mapDB.get(preKey));
			
			//3.判断是否需要修改数据库
			if(nowNum >= mapDB.get(preKey)){
				
				UuidModel tempUm = new UuidModel();
				tempUm.setPreKey(preKey);
				tempUm.setNum(mapDB.get(preKey) + cacheNum);
				System.out.println("now=============="+tempUm);
				uuidServiceDao.update(tempUm);
				mapDB.put(preKey, tempUm.getNum());//同时修改mypDB
			}
		}else {
			nowNum = 1;
			//4.如果不存在,就直接操作数据库,同时向mapDB/mapNow添加数据
			mapNow.put(preKey, 1);
			mapDB.put(preKey, cacheNum);
			UuidModel tempUm = new UuidModel();
			tempUm.setPreKey(preKey);
			tempUm.setNum(cacheNum);
			uuidServiceDao.create(tempUm);
		}	
		
		return nowNum;
	}

}


自己写main方法测试

 

java代码:
public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext(
				new String[] {"applicationContext.xml"});
		UuidServiceEbi ebi = (UuidServiceEbi) context.getBean("uuidEbi");
		
		System.out.println("uuid:"+ebi.getNextUuid("aa", 10));
		System.out.println("uuid:"+ebi.getNextUuid("aa", 10));
		
	}

}


然后就报错了

 

xml代码:
Exception in thread "main" org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [cn.xiaoxing.uuidservice.vo.UuidModel#aa]
	at org.hibernate.engine.internal.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:697)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:296)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:241)
	at org.hibernate.event.internal.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:55)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
	at org.hibernate.internal.SessionImpl.fireUpdate(SessionImpl.java:786)
	at org.hibernate.internal.SessionImpl.update(SessionImpl.java:778)
	at org.hibernate.internal.SessionImpl.update(SessionImpl.java:774)
	at cn.xiaoxing.dao.impl.S3H4Template.update(S3H4Template.java:37)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:319)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
	at $Proxy5.update(Unknown Source)


报错内容大致是“具有相同标识符值的不同对象已经与会话相关联的”,难道要我解除查询出的PO与session之间的绑定。我尝试在impl里的update方法后使用sessionFactory.evict(m),可问题没有解决!

教程上咋没有遇到这个问题呢?此类问题该如何解决呢?


推广链接
精品视频课程推荐

研磨设计模式——跟着cc学设计系列视频教程
本视频课程是北京Java私塾原创精品书籍《研磨设计模式》一书的配套学习视频,由《研磨设计模式》的第一作者CC录制 课程目标:全面、系统的掌握GoF设计模式的知识,达到可以在实际项目开发中运用的能力 技术要点:如何实现可配置、如何实现缓存以及缓存的管理、如何实现用缓存来控制多实例的创建、如何实现参数化工厂、 如何实现可扩展工厂、如何实现原型管理器、如何实现Java的静态代理和动态代理、如何实现多线程处理队列请求、 如何实现命令的参数化配置、可撤销的操作、宏命令、队列请求和日志请求、如何实现翻页迭代、如何检测环状结构、 如何实现通用的增删改查、如何模拟工作流来处理流程、如何实现简单又通用的XML读取、如何实现模拟AOP的功能......

ssh+jbpm项目(某集团OA)视频教程
达到能综合使用Struts2+Spring3+Hibernate3+Jbpm4来进行实际项目开发的能力。 包括:ssh和jbpm的整合;数据字典;通用DAO(Spring+Hibernate+泛型+反射+SpEL+模板方法模式);自动生成UUID的加强版;分层开发、SSH联合的基本开发;翻页的taglib;示范真实值和表现值,数据参照的实现;文件上传下载;主子表操;登录验证码;登录控制的拦截器

XML基础视频教程
创建规范的XML文档,DTD的作用,并且可以根据要求创建私用的DTD,通过JavaScript解析XML DOM

深入浅出学Spring Web MVC视频教程
系统、完整的学习Spring Web MVC开发的知识。包括:Spring Web MVC入门;理解DispatcherServlet;注解式控制器开发详解;数据类型转换;数据格式化;数据验证; 拦截器;对Ajax的支持;文件上传下载;表单标签等内容;最后以一个综合的CRUD带翻页的应用示例来综合所学的知识

高级软件架构师实战培训阶段一
内容概述:本课程专注于构建:高可扩展性、高性能、大数据量、高并发、分布式的系统架构。 从零开始、全面系统、成体系的软件架构课程,循序渐进的讲述构建上述系统架构所需要的各种技术知识和技能。
技术要点: 1:构建基本的业务功能块,基于Maven+Git+Spring mvc+spring+mybatis+ehcache+mysql+X-gen代码生成
 2:高扩展性的分布式体系架构(基于Nginx+Varnish+Memcache+ActiveMQ)
 3:NoSQL的合理使用和架构优化(基于MongoDB)
 4:分布式文件存储和架构优化(基于MogileFS)



个性签名:知人者智,自知者明。
cc3cc3
[头像]

交流经验:
总积分:61343
级别:VIP5
注册时间: 2011-09-17
文章: 49
离线

这个应该是你加了事务的问题,也就是你前面一个事务没有提交,本来这两次 getNextUuid应该在不同的事务运行的,估计你整到一个事务里面去了.
潜龙
[头像]

交流经验:
总积分:35429
级别:VIP5
注册时间: 2011-11-10
文章: 160
离线

 

cc3cc3写
这个应该是你加了事务的问题,也就是你前面一个事务没有提交,本来这两次 getNextUuid应该在不同的事务运行的,估计你整到一个事务里面去了.

 

把tomcat启动后测试就没这个问题了,在main方法测试才会存在。



个性签名:知人者智,自知者明。
cc3cc3
[头像]

交流经验:
总积分:61343
级别:VIP5
注册时间: 2011-09-17
文章: 49
离线

因为你的web.xml里面,配置了 openSessionInView呢,呵呵
 
交流首页 » 学习问题讨论
前往:   

关于我们 | 联系我们 | 用户协议 | 私塾在线服务协议 | 版权声明 | 隐私保护

版权所有 Copyright(C)2009-2012 私塾在线学习网