终于用hibernate把数据持久层写完了 小结下遇到的一些问题

    这个学期开了门不太感兴趣的课,叫什么“实用软件文档写作”,而且是个不太喜欢的老师讲,更郁闷的是,还教我们两科,还有一个叫什么“团队勾通与项目管理”。

    其实倒是不是不喜欢这两课,主要是这个老师发挥的神奇作用。上课就扯些莫名奇妙的东西,跟书没多少关系,然后就说是让我们体会团队的力量,搞一些更莫名奇妙的游戏,还要交报告。最郁闷的应该是,她花了几节课给我们讲情商的作用,结果我们得出的结论是她自己的情商相当的。。。不说了,毕竟人家是老师,还是点到即止吧。

    言归正传,其中那个“实用软件文档写作”的课程,开始是要我们写文档,从需求分析到概要设计说明书,详细设计说明书……个人其实对这个不太感兴趣。可是没得办法,还是硬着头皮写了。后来,整了句要我们最后把小组做的项目实现出来,还要交代码。我们小组开始选了个书店租赁管理系统,如果想偷懒的话,可以直接用java写个应用程序,然后跟数据库连接一下就交了。可是回过来一想,自己这些天把struts2跟hibernate都看耳,何不就用这两个东西来做个b/s模式的呢?也算是个实践的机会,对这两个东西也会有些更深的理解。

    最初觉得hibernate没多少东西好学,就把那个模式套一下就好了。在实践的过程中遇到了很多问题才发现,自己犯个很大很大的错误,也正是问题让自己对hibernate有了更深的了解。把其中遇到的几个问题贴一下,作下小结。


1. Caused by: org.hibernate.MappingException: entity class not found: Boss
即便是类Boss与类的mapping文件Boss.hbm.xml放在一个包下,如果不在Boss.bhm.xml中指明Boss类的位置,还是会出这个错误,在Boss前面加上包名就好了。

2. Caused by: org.xml.sax.SAXParseException: Attribute "colnumn" must be declared for element type "id".
用插件生成的<id name="id" type="int" column="id">这样的代码是有问题的,总是报错.但之前做的那个又没问题,我还没弄明白是什么原因,换成下面这样就好了:
<id    name="id" type="java.lang.Integer">
            <column name="id" not-null="true"/>
            <generator class="increment"/>
        </id>
上面的type直接设成int也是可以的。

3. 在一段代码中有两个操作访问同一个DAO,如果分别访问即运行时注释掉一个而只让一个运行则没有问题;但如果让两个都执行的话,就会提示Session was already closed。而且是在第一个操作执行finally的close session时,
问题在于在DAO类中,前面创建session使用的是HibernateUtil.currentSession的方法,在关闭的时候又使用了session.close()的方法,问题也就产生了。因为我在HibernateUtil.currentSession()使用的是ThreadLocal类,也就是说并不是为每个新的请求创建一个新的session,而只是把原先那个session中的内容copy一份给新的session,所以采用session.close()方法关闭这个session时就把最开始的那个session给关闭了,所以就会出现这个问题;将关闭session的代码换成HibernateUtil.closeSession()就好了。

4. 我从api中查到有这个方法iterate,返回一个Iterator类型,但使用的时候IDE提示要求强制转换成Iterator
Iterator iterator = (Iterator) query.iterate();
然后运行的时候就直接报了下面的错误
org.hibernate.impl.IteratorImpl cannot be cast to javassist.bytecode.Descriptor$Iterator

5. failed to lazily initialize a collection of role: no session or session was closed
将对应一对多的那两个列lazy=true改为lazy=false即可,这个是延时加载跟即时加载的问题,我个人觉得可能是hibernate在设计的时候对collection考虑到效率跟性能的问题而采取的措施。

你可能感兴趣的:(DAO,设计模式,游戏,Hibernate,项目管理)