- 浏览: 643877 次
- 性别:
- 来自: 杭州
-
文章分类
最新评论
-
liuche20083736:
非常好
从问题看本质: 研究TCP close_wait的内幕 -
xiaopohai85707:
优化算法与原来需求不符
过滤字符的性能调优?挤一挤还是有的 -
kmy_白衣:
生成的area图有时候 标签的数值和图标上看上去的数值不一致。 ...
OpenFlashChart2之恶心文档 -
tom&jerry:
大神,请教一个问题,按名称排序为何无效,用的2.4.3 XPA ...
深入浅出jackrabbit之十三 查询之AST和QT -
jd2bs:
改成精确匹配可以了< filter-mapping &g ...
细谈Ehcache页面缓存的使用
/**
*作者:张荣华(ahuaxuan)
*2007-04-24
*转载请注明出处及作者
*/
Hibernate在使用关联集合的时候有自己的几种类型,分别是set,list,map,bag等,而对应的hibernate实现是PersistentSet, PersistentList, PersistentBag等,几种集合类型的使用场合问题并不是今天要讨论的话题,今天要讨论的是如何在程序中使用我们自己写的集合类型,这一点
当然很多人人会质疑这样做的必要性,他们会问hibernate提供的集合类型已经够用了,为什么还要自己扩展呢? 事实上在有些情况下使用自己的集合类型是非常重要的,比如说(下面我们就以PersistentSet类举例,其他集合类情况类似)
PersistentSet类并没有序列化id,也就是说在分布式环境中如果两边的jvm版本不一样,那么没有序列化id的话,序列化一方会采用自己默认的序列化id,而反序列化一方的也会采用自己的默认的序列化id,而这两个id一般是不一样的,导致一方序列化之后另一方就无法进行正常的反序列化。当然我想应该还有其他情况需要这种扩展的,所以把它共享出来。
考虑到直接修改源代码可能和开源协议会有冲突,所以我就想到扩展自己的集合类,但是在互联网上并没有相关的信息,我在阅读了hibernate3.1的源代码之后找到了解决方案。
以下是具体实现和我的解决问题的过程:
当时想到思路之后没有办法入手,看了一下文档发现文档中并没有详细的说明,只有在一个不起眼的地方表明set节点有collectiontype这个attribute,也没有说这个collectiontype是做什么用的。报着试试的心理,我觉得应该从这个collectiontype入手,于是想到要实现自己的集合类就应该先看看hibernate源代码中PersistentSet相关代码,阅读后发现,hibernate返回什么集合类型是由对应的type类决定的,拿SetType来说
由此可以看出要返回什么集合类型确实是由对应的type类决定的,那么就是说要实现自己的集合类必须要搞清楚collectiontype的用法,也就是说必须要先处理我自己的collectiontype,而不是我自己的PersistentSet类,既然是type类,那我想就应该查看org.hibernate.type这个package里的类,看着看着先找到的是一个CustomCollectionType类:
发现要实现自己collectiontype必须要实现UserCollectionType这个接口(以上hibernate源代码中抛出的异常告诉我们实现自己的collectiontype必须要实现这个接口),
下面的就是UserCollectionType这个接口,我们只需要模范SetType来实现这个接口就可以了
步骤1:实现自己的type类
步骤2:创建自己的集合类:
步骤3:在set节点的collectiontype的attribute上指定我们的AhuaxuanPersistentSetType类了。
这样我们就成功的扩展了hibernate,并可以让我们的collectiontype指定返回我们的集合类,以上从遇到问题到产生想法再到实现一共使用了2个小时,只要思路正确,就离问题的解决不远了。
在分布式环境下使用hibernate是会遇到不少问题的,如果团队中没有精通hibernate的成员,那还是推荐ibatis。
希望这篇文章能够对遇到类似问题的同学有帮助。
作者:张荣华,未经作者同意不得随意转载!
谢谢,其实懂spring和hibernate的人还是挺多的,但是不懂的人更多。我估计我只是中级水平还不到。当然也不乏很多人懂了一点皮毛就说自己是精通,这种例子也见过很多了。
国内的IT水平要提高只有靠大家的努力,我觉得只要我们做到以下几点国内的水平一定能提高:
1 少谈大道理,多写好代码
2 不要好高骛远
3 成败在于细节
4 讲究学习方法
5 多实践
软件开发是一门工程学,不是说智商越高就越能做好的,当然智商是基础,动手能力的重要性不比智商低。
*作者:张荣华(ahuaxuan)
*2007-04-24
*转载请注明出处及作者
*/
Hibernate在使用关联集合的时候有自己的几种类型,分别是set,list,map,bag等,而对应的hibernate实现是PersistentSet, PersistentList, PersistentBag等,几种集合类型的使用场合问题并不是今天要讨论的话题,今天要讨论的是如何在程序中使用我们自己写的集合类型,这一点
当然很多人人会质疑这样做的必要性,他们会问hibernate提供的集合类型已经够用了,为什么还要自己扩展呢? 事实上在有些情况下使用自己的集合类型是非常重要的,比如说(下面我们就以PersistentSet类举例,其他集合类情况类似)
PersistentSet类并没有序列化id,也就是说在分布式环境中如果两边的jvm版本不一样,那么没有序列化id的话,序列化一方会采用自己默认的序列化id,而反序列化一方的也会采用自己的默认的序列化id,而这两个id一般是不一样的,导致一方序列化之后另一方就无法进行正常的反序列化。当然我想应该还有其他情况需要这种扩展的,所以把它共享出来。
考虑到直接修改源代码可能和开源协议会有冲突,所以我就想到扩展自己的集合类,但是在互联网上并没有相关的信息,我在阅读了hibernate3.1的源代码之后找到了解决方案。
以下是具体实现和我的解决问题的过程:
当时想到思路之后没有办法入手,看了一下文档发现文档中并没有详细的说明,只有在一个不起眼的地方表明set节点有collectiontype这个attribute,也没有说这个collectiontype是做什么用的。报着试试的心理,我觉得应该从这个collectiontype入手,于是想到要实现自己的集合类就应该先看看hibernate源代码中PersistentSet相关代码,阅读后发现,hibernate返回什么集合类型是由对应的type类决定的,拿SetType来说
public class SetType extends CollectionType { public SetType(String role, String propertyRef, boolean isEmbeddedInXML) { super(role, propertyRef, isEmbeddedInXML); } public PersistentCollection instantiate(SessionImplementor session, CollectionPersister persister, Serializable key) { if ( session.getEntityMode()==EntityMode.DOM4J ) { return new PersistentElementHolder(session, persister, key); } else { return new PersistentSet(session); }//type类决定返回的集合类 } public Class getReturnedClass() { return java.util.Set.class; } public PersistentCollection wrap(SessionImplementor session, Object collection) { if ( session.getEntityMode()==EntityMode.DOM4J ) { return new PersistentElementHolder( session, (Element) collection ); } else { return new PersistentSet( session, (java.util.Set) collection );//type类决定返回的集合类 } } public Object instantiate() { //TODO: Might need to be a LinkedHashSet!!!!!! return new HashSet(); } }
由此可以看出要返回什么集合类型确实是由对应的type类决定的,那么就是说要实现自己的集合类必须要搞清楚collectiontype的用法,也就是说必须要先处理我自己的collectiontype,而不是我自己的PersistentSet类,既然是type类,那我想就应该查看org.hibernate.type这个package里的类,看着看着先找到的是一个CustomCollectionType类:
public class CustomCollectionType extends CollectionType { private final UserCollectionType userType; public CustomCollectionType(Class userTypeClass, String role, String foreignKeyPropertyName, boolean isEmbeddedInXML) { super(role, foreignKeyPropertyName, isEmbeddedInXML); if ( !UserCollectionType.class.isAssignableFrom(userTypeClass) ) { throw new MappingException( "Custom type does not implement UserCollectionType: " + userTypeClass.getName() ); }//也就是说要实现自己的type类就要实现usercollectiontype这个接口,看到这里,思路基本上就确定了。 try { userType = (UserCollectionType) userTypeClass.newInstance(); } catch (InstantiationException ie) { throw new MappingException( "Cannot instantiate custom type: " + userTypeClass.getName() ); } catch (IllegalAccessException iae) { throw new MappingException( "IllegalAccessException trying to instantiate custom type: " + userTypeClass.getName() ); } } public PersistentCollection instantiate(SessionImplementor session, CollectionPersister persister, Serializable key) throws HibernateException { return userType.instantiate(session, persister); } public PersistentCollection wrap(SessionImplementor session, Object collection) { return userType.wrap(session, collection); } public Class getReturnedClass() { return userType.instantiate().getClass(); } public Object instantiate() { return userType.instantiate(); } public Iterator getElementsIterator(Object collection) { return userType.getElementsIterator(collection); } public boolean contains(Object collection, Object entity, SessionImplementor session) { return userType.contains(collection, entity); } public Object indexOf(Object collection, Object entity) { return userType.indexOf(collection, entity); } public Object replaceElements(Object original, Object target, Object owner, Map copyCache, SessionImplementor session) throws HibernateException { CollectionPersister cp = session.getFactory().getCollectionPersister( getRole() ); return userType.replaceElements(original, target, cp, owner, copyCache, session); } }
发现要实现自己collectiontype必须要实现UserCollectionType这个接口(以上hibernate源代码中抛出的异常告诉我们实现自己的collectiontype必须要实现这个接口),
下面的就是UserCollectionType这个接口,我们只需要模范SetType来实现这个接口就可以了
/** * A custom type for mapping user-written classes that implement <tt>PersistentCollection</tt> * * @see org.hibernate.collection.PersistentCollection * @author Gavin King */ public interface UserCollectionType { /** * Instantiate an uninitialized instance of the collection wrapper */ public PersistentCollection instantiate(SessionImplementor session, CollectionPersister persister) throws HibernateException; /** * Wrap an instance of a collection */ public PersistentCollection wrap(SessionImplementor session, Object collection); /** * Return an iterator over the elements of this collection - the passed collection * instance may or may not be a wrapper */ public Iterator getElementsIterator(Object collection); /** * Optional operation. Does the collection contain the entity instance? */ public boolean contains(Object collection, Object entity); /** * Optional operation. Return the index of the entity in the collection. */ public Object indexOf(Object collection, Object entity); /** * Replace the elements of a collection with the elements of another collection */ public Object replaceElements( Object original, Object target, CollectionPersister persister, Object owner, Map copyCache, SessionImplementor session) throws HibernateException; /** * Instantiate an empty instance of the "underlying" collection (not a wrapper) */ public Object instantiate(); }看到这里开始思路就步上了正轨。大家也都知道怎么做了,开始代码部分吧
步骤1:实现自己的type类
/** * * @author 张荣华 * 转载请注明出处 */ public class AhuaxuanPersistentSetType implements UserCollectionType { public PersistentCollection instantiate(SessionImplementor arg0, CollectionPersister arg1) throws HibernateException { return new AhuaxuanPersistentSet(arg0); }//这个方法也必须返回我们自己的集合类 public PersistentCollection wrap(SessionImplementor arg0, Object arg1) { if (arg0.getEntityMode() == EntityMode.DOM4J) { return new PersistentElementHolder(arg0, (Element) arg1); } else { return new AhuaxuanPersistentSet(arg0, (Set) arg1); }//这个方法也必须返回我们自己的集合类 }//这个方法是最重要的,告诉hibernate我们是返回什么样的具体类型,这里我们指定的是自己的集合类,之所以这样写是因为hibernate自己的type类是这样实现的 //而其他需要实现的方法是拷自hibernate自己的type类,基本可以忽略 }
步骤2:创建自己的集合类:
public class AhuaxuanPersistentSet extends PersistentSet { //这个类其实是继承自hibernate自己的PersistentSet,因为我们只需要下面这个//serialVersionUID而已 /** * * @author 张荣华 * 转载请注明出处 */ private static final long serialVersionUID = 3821652119009257031L; public AhuaxuanPersistentSet(SessionImplementor session) { super(session); } public AhuaxuanPersistentSet(SessionImplementor session, Set set) { super(session, set); } public AhuaxuanPersistentSet() { } }
步骤3:在set节点的collectiontype的attribute上指定我们的AhuaxuanPersistentSetType类了。
<set collection-type=" AhuaxuanPersistentSetType" name="aa" inverse="true" cascade="save-update" > <key> <column name="aa" precision="10" scale="0"/> </key> <one-to-many class="test.User"/> </set>
这样我们就成功的扩展了hibernate,并可以让我们的collectiontype指定返回我们的集合类,以上从遇到问题到产生想法再到实现一共使用了2个小时,只要思路正确,就离问题的解决不远了。
在分布式环境下使用hibernate是会遇到不少问题的,如果团队中没有精通hibernate的成员,那还是推荐ibatis。
希望这篇文章能够对遇到类似问题的同学有帮助。
作者:张荣华,未经作者同意不得随意转载!
评论
4 楼
somebody
2007-09-20
赞一个。
不错的分享。
不错的分享。
3 楼
cm4ever
2007-07-31
提交给hibernate组织没?
2 楼
ahuaxuan
2007-07-26
fuwang 写道
很多公司都在用spring+hibernate,可是真正懂的人非常之少,大部分人都是照着写增删改查,经常是出了问题而不自知,导致垃圾项目一个接着一个。要是做的是电信和金融等方面的项目,真让人胆颤心惊啊。
像楼主这样爱研究又愿意分享的人不多了,希望楼主在技术上继续精进,只有你这样的人多了,国内的IT水平才能真正提高啊。
像楼主这样爱研究又愿意分享的人不多了,希望楼主在技术上继续精进,只有你这样的人多了,国内的IT水平才能真正提高啊。
谢谢,其实懂spring和hibernate的人还是挺多的,但是不懂的人更多。我估计我只是中级水平还不到。当然也不乏很多人懂了一点皮毛就说自己是精通,这种例子也见过很多了。
国内的IT水平要提高只有靠大家的努力,我觉得只要我们做到以下几点国内的水平一定能提高:
1 少谈大道理,多写好代码
2 不要好高骛远
3 成败在于细节
4 讲究学习方法
5 多实践
软件开发是一门工程学,不是说智商越高就越能做好的,当然智商是基础,动手能力的重要性不比智商低。
1 楼
fuwang
2007-07-23
很多公司都在用spring+hibernate,可是真正懂的人非常之少,大部分人都是照着写增删改查,经常是出了问题而不自知,导致垃圾项目一个接着一个。要是做的是电信和金融等方面的项目,真让人胆颤心惊啊。
像楼主这样爱研究又愿意分享的人不多了,希望楼主在技术上继续精进,只有你这样的人多了,国内的IT水平才能真正提高啊。
像楼主这样爱研究又愿意分享的人不多了,希望楼主在技术上继续精进,只有你这样的人多了,国内的IT水平才能真正提高啊。
发表评论
-
过滤字符的性能调优?挤一挤还是有的
2010-05-29 05:54 3656/* *auth ... -
Master-Slave,Spring,Hibernate,故事曲折离奇,情结跌宕起伏
2009-02-05 13:49 8755/** *作者:张荣华 *日期 ... -
弃成见,反省,并重新认识struts.i18n.encoding
2008-12-24 15:42 3939[size=medium]之前和大家讨论了struts2.0中 ... -
关键字:查询,事务,粒度
2008-08-22 17:05 5188[size=medium]/** *作者: ... -
看看mina和memcached的联姻(适合不同语言客户端,高并发?)
2008-07-21 17:06 8055[size=medium]/** * 作者:张荣华 * 日 ... -
如何解决mysql的master-slave模式中ReplicationDriver的使用问题
2008-06-19 18:23 8258/** * 作者:张荣华 * 日期:2008-6-19 ... -
别装了,难道你们不想把properties直接注入到object中去(spring-plugin)?
2008-04-09 18:01 3691[size=small]/** *作者:张荣华(ahuaxu ... -
用jamon来监控你的sql执行效率
2008-02-25 15:48 3750/** *作者:张荣华 *日期:2008-2-25 ... -
java同msn的通信,大家想想用途吧
2007-11-24 17:14 2558程序员的生活真是单调,除了编程还是编程,工作日 ... -
EAI企业应用集成场景及解决方案
2007-09-21 18:21 3172/** *作者:张荣华(ahuaxuan) *2007-9 ... -
quartz和应用的集群问题
2007-08-21 18:36 12853之前看到很多关于quartz的讨论,尤其是关于quar ... -
优化程序之前,可用Jamon来监测你的Spring应用
2007-08-14 18:14 8206/** *作者:张荣华(ahuaxuan) *2007-8-1 ... -
请问责任链真的是一种设计模式吗
2007-07-26 18:12 9480坛子上讨论设计模式的也挺多的,但是关于这个责任链模式还没有人提 ... -
把ActiveMQ的控制台整合到你的web程序中
2007-07-19 12:06 8900在使用ActiveMQ的时候把ActiveMQ的控制台整 ... -
设计模式之:解剖观察者模式
2007-07-17 16:12 6919[size=9] 论坛上很多人都 ... -
java邮件:在简单和复杂之间的方案
2007-07-11 18:07 7603/** *作者:张荣华(ahuaxu ... -
强强连手, 在模板中分页,看Freemarker和displaytag的结合
2007-07-09 09:22 6947/** *作者:张荣华(ahuaxuan) *2007-0 ... -
解惑:在spring+hibernate中,只读事务是如何被优化的。
2007-06-28 18:22 7644/** *作者:张荣华(ahuaxuan) *2007- ... -
让webwork零配置 第二章(实现)(实例已放出,大家可以下载运行)
2007-06-25 09:23 5752/** *作者:张荣华(ahuaxuan) *2007-0 ... -
让webwork2零配置,第一章(主贴再次更新)
2007-06-18 15:41 13475/** *作者:张荣华(ahuaxuan) *2007-0 ...
相关推荐
win7修复本地系统工具
《自动化专业英语》04-Automatic-Detection-Block(自动检测模块).ppt
《计算机专业英语》chapter12-Intelligent-Transportation.ppt
内容概要:本文详细介绍了基于西门子S7-1200博图平台的3轴伺服螺丝机程序。该程序使用SCL语言编写,结合KTP700组态和TIA V14及以上版本,实现了对X、Y、Z三个轴的精密控制。文章首先概述了程序的整体架构,强调了其在自动化控制领域的高参考价值。接着深入探讨了关键代码片段,如轴初始化、运动控制以及主程序的设计思路。此外,还展示了如何通过KTP700组态实现人机交互,并分享了一些实用的操作技巧和技术细节,如状态机设计、HMI交互、异常处理等。 适用人群:从事自动化控制系统开发的技术人员,尤其是对西门子PLC编程感兴趣的工程师。 使用场景及目标:适用于希望深入了解西门子S7-1200博图平台及其SCL语言编程特点的学习者;旨在帮助读者掌握3轴伺服系统的具体实现方法,提高实际项目中的编程能力。 其他说明:文中提供的代码示例和设计理念不仅有助于理解和学习,还能直接应用于类似的实际工程项目中。
内容概要:本文详细探讨了五种非线性滤波器(卡尔曼滤波(KF)、扩展卡尔曼滤波(EKF)、无迹卡尔曼滤波(UKF)、粒子滤波(PF)和变维卡尔曼滤波(VDKF))在水下长基线定位(LBL)系统中的应用。通过对每种滤波器的具体实现进行MATLAB代码展示,分析了它们在不同条件下的优缺点。例如,KF适用于线性系统但在非线性环境中失效;EKF通过雅可比矩阵线性化处理非线性问题,但在剧烈机动时表现不佳;UKF利用sigma点处理非线性,精度较高但计算量大;PF采用蒙特卡罗方法,鲁棒性强但计算耗时;VDKF能够动态调整状态维度,适合信标数量变化的场景。 适合人群:从事水下机器人(AUV)导航研究的技术人员、研究生以及对非线性滤波感兴趣的科研工作者。 使用场景及目标:①理解各种非线性滤波器的工作原理及其在水下定位中的具体应用;②评估不同滤波器在特定条件下的性能,以便为实际项目选择合适的滤波器;③掌握MATLAB实现非线性滤波器的方法和技术。 其他说明:文中提供了详细的MATLAB代码片段,帮助读者更好地理解和实现这些滤波器。此外,还讨论了数值稳定性问题和一些实用技巧,如Cholesky分解失败的处理方法。
VMware-workstation-full-14.1.3-9474260
DeepSeek系列-提示词工程和落地场景.pdf
javaSE阶段面试题
《综合布线施工技术》第5章-综合布线工程测试.ppt
安川机器人NX100使用说明书.pdf
内容概要:本文详细介绍了将M7120型平面磨床的传统继电器控制系统升级为基于西门子S7-1200 PLC的自动化控制系统的过程。主要内容涵盖IO分配、梯形图设计和组态画面实现。通过合理的IO分配,确保了系统的可靠性和可维护性;梯形图设计实现了主控制逻辑、砂轮升降控制和报警逻辑等功能;组态画面则提供了友好的人机交互界面,便于操作和监控。此次改造显著提高了设备的自动化水平、运行效率和可靠性,降低了维护成本。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是熟悉PLC编程和控制系统设计的专业人士。 使用场景及目标:适用于需要进行老旧设备升级改造的企业,旨在提高生产设备的自动化水平和可靠性,降低故障率和维护成本。具体应用场景包括但不限于金属加工行业中的平面磨床等设备的控制系统改造。 其他说明:文中还分享了一些实际调试中的经验和技巧,如急停逻辑的设计、信号抖动的处理方法等,有助于读者在类似项目中借鉴和应用。
chromedriver-linux64-136.0.7103.48.zip
IMG_20250421_180507.jpg
《网络营销策划实务》项目一-网络营销策划认知.ppt
Lianantech_Security-Vulnerabil_1744433229
MybatisCodeHelperNew2019.1-2023.1-3.4.1
【深度学习部署】基于Docker的BERT模型训练与API服务部署:实现代码复用与模型共享
摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装火车票订票系统软件来发挥其高效地信息处理的作用,可以规范信息管理流程,让管理工作可以系统化和程序化,同时,火车票订票系统的有效运用可以帮助管理人员准确快速地处理信息。 火车票订票系统在对开发工具的选择上也很慎重,为了便于开发实现,选择的开发工具为Eclipse,选择的数据库工具为Mysql。以此搭建开发环境实现火车票订票系统的功能。其中管理员管理用户,新闻公告。 火车票订票系统是一款运用软件开发技术设计实现的应用系统,在信息处理上可以达到快速的目的,不管是针对数据添加,数据维护和统计,以及数据查询等处理要求,火车票订票系统都可以轻松应对。 关键词:火车票订票系统;SpringBoot框架,系统分析,数据库设计
【ABB机器人】-00标准保养简介.pdf
最新校园跑腿小程序源码 多校版本,多模块,适合跑腿,外卖,表白,二手,快递等校园服务 此版本为独立版本,不需要微擎 直接放入就可以 需要自己准备好后台的服务器,已认证的小程序,备案的域名!