今天在做用户添加的过程中遇到不少问题,所幸在下班之前都解决了,下面我来说说解决过程和原因吧。
1.Hibernate自动映射外键字段的解决办法
经常的表中会有外键字段,使用Hibernate自动映射时它会将这一字段设置成一个Many-to-One之类的类型,与之对应的又是另一个持久化类。而实际上在页面上添加数据时,这些外键的数据已经获取好了,不需要再去获取列表。解决办法就是把这些Many-to-One之类的字段改为我们常用的实际数据类型,切换到数据视图,找到所对应的表,重新生成文件,在弹出的窗口中连续点击两次“Next”到最后一个界面,会看到“Generate support for ListedTable(fk)->UnlistedTable”和“Generate support for UnlistedTable(fk)->ListedTable”这两项是打勾的,将其去掉后,按“Finish”重新映射该表,可以发现原先那些“Many-to-One”之类的字段已经被替换成实际的数据类型了。...
使用平台:Eclipse3.2、MyEclipse5.01GA
Struts、Spring、Hibernate三个框架在MyEclipse下添加顺序为:
首先新建一个Web Project,
添加Add Struts Capabilities…,设置好包路径后继续;
选择MyEclipse菜单下的Add Spring Capabilities…选择所有的标签库,JAR Library Installation位置选择“Copy”项,下一步,设置Spring Bean配置文件位置,一般就默认在SRC目录,点击完成,就添加了Spring,继续;
...
1、什么是iBATIS
1.1作者
Clinton Begin,很牛X的名字
1.2背景故事
Clinton Begin于2001年启动iBATIS项目,最先的焦点是发展密码软件解决方案。第一个iBATIS产品是Secrets,是一个象PGP的个人数据加密器和签名工具。Secrets完全用Java编写并在一个开源许可下发布。
在发布Secrets Java版后不久,iBATIS项目陷入困境转而关注Web和其它internet相关的技术,在接下来的一年中,两个有趣的软件开发完成,包括Axle web 框架,一个JSP可选工具。Lookout邮件客户端差不多完成90%在 being set on the back burner之前,同时更多有趣的挑战接踵而来…
1. 4“iBATIS”是什么意思
现在,单词“ibatis”和SQL Maps 与 DAO 框架同义――就象“xerox”『施乐复印机(商标名称),译者著』和“photocopy” 『影印,译者著』同义。
回想起iBATIS来源于密码系统软件。iBATIS实际上用两个单词的组合来命名:“internet” 和 “abatis”。
Reference.com 如此定义 abatis:
ab-a-tis
n. pl. ab-a-tis (-tz) or ab-a-tis-es (-t-sz)
将伐倒的树木树枝相互交叉,放置,有时削尖,面对敌人一种防御障碍物。
将“Internet”中象征性的“i”和abatis中的“batis”组合所以暗示了抵御Internet的意思。-in the case of iBATIS它是Secrets提供的关于密码防御的东西。
所以iBATIS正确的写法应该是:iBATIS
1.5 iBATIS怎么念?
因为我们发明了这个单词,我们以自己喜欢的读音念它
我们这样读:eye-BAT-iss
但是按照传统,它可能应该被读作:eye-BATE-iss,但就象我们说的,我们创造了它。
ibatis的openSession在上一版本时,每次打开的都是同一session, 因为它原来的代码在每次打开前会去localSqlMapSession中查找,如果没有才会打开个新的,而且会在返回前放入localSqlMapSession中,这被认为是一个BUG,所以在这个版本上改为返回一个新的session.而在这个session关闭时,才会把这个session返回给sessionPool中.
而在spring中,如楼上我的贴子所说,新打开的session没有进入localSqlMapSession,在打开一对多的表的子表时, 于是从sessionPool中得到一个没有被spring设置过setUserConnection的session,从而Transaction trans = getTransaction(session);这里没有得到缺省的事务,那么 trans = autoStartTransaction(session, autoStart, trans);代码里就会去找这个session的txManager来启动一个事务,但txManager又是null,于是就会发出nullpoint异常了.
这时关键就是session的txManager是什么时候设置的. 我们可以看一下spring的SqlMapClientFactoryBean的代码就会发现,只有设置了它的dataSource属性时,才会去设置session的txManager, 所以这里就可以看出在一对多表时,SqlMapClientFactoryBean的dataSource属性一定要设置, 这样能保证在一对多时才不会出问题.
背景: 一个存在多对一的映射的表结构,比如视频和视频上传者,目前想取出最受欢迎的视频并要求显示视频的上传者的名字,传统的做法往往会存在n+1问题,对性能有些影响
在IBatis中如何做?马上进入实战
配置文件如下: