• Hibernate中遇见的问题


    1、在用Hibernate写增删改查时,有两种方式:a、HQL语句,b、原生态sql语句

    如果我要执行的语句是:select * from Question

    HQL是这么写的:

    Session session = getSession();

    String hql="from Question";

    List list = (Question)session.createQuery(hql).list();

    System.out.println(list.getTitle());

    测试正常

    SQL写法:

    Session session=getSession();

    String sql="select * from Question"

    List list=(Question)session.createSQLQuery(sql).list();// 会发生类型转换错误,就是文章开头的那个错误

    原因:
    HQL中

    String hql="from Question";

    List list = (Question)session.createQuery(hql).list();

    会根据你的hql语句,自动将session.createQuery(hql).list()的返回对象以hibernate生成的Bean为对象装入list返回

    SQL中

    String sql="select * from Question"

    List list=(Question)session.createSQLQuery(sql).list();

    则是以对象数组进行存储返回

    一句话:HQL:返回list装的是Bean SQL:返回对象就是一数组,数组在转为Question对象时,当然会报错。

    解决方法:

    第一种:直接老老实实用HQL去写吧= =参数化就百度“Hibernate 参数绑定”就行

    第二种:使用原生SQL,调用其中的一个方法addEntity()

    String sql="select * from Question";

    Query query = session.createSQLQuery(sql).addEntity(XXXXXXX.class);

    List list = (Question)query;

    这样 list中也就装的是Question这洋一个个Bean对象了,问题还是不知道如何参数化= =!

    找到方法了:

    Hibernate中的分页语句可以这么写

         session = HibernateUtils.getSession();
         session.beginTransaction();
         Query query = session.createQuery("from User");
         query.setFirstResult(0);//从第一条记录开始
         query.setMaxResults(4);//取出四条记录
         List userList = query.list();

     

    2、a different object with the same identifier value was already associated with the session。

      错误原因:在hibernate中同一个session里面有了两个相同标识但是是不同实体。

      解决方法一:session.clean()

      PS:如果在clean操作后面又进行了saveOrUpdate(object)等改变数据状态的操作,有可能会报出"Found two representations of same collection"异常。

      解决方法二:session.refresh(object)

       PS:当object不是数据库中已有数据的对象的时候,不能使用session.refresh(object)因为该方法是从hibernate的 session中去重新取object,如果session中没有这个对象,则会报错所以当你使用saveOrUpdate(object)之前还需要判 断一下。

      解决方法三:session.merge(object)

      PS:Hibernate里面自带的方法,推荐使用。

    3、Found two representations of same collection

      错误原因:见1。

      解决方法:session.merge(object)

    2、3、两中异常经常出现在一对多映射和多对多映射中

     

    我很小我很弱,我在慢慢成长!
  • 相关阅读:
    Flare3D游戏特效教程:火拳阿宝
    AS3:物体的运动
    Away3D基础教程(三):三维世界的灯光
    代码库工具:SVN
    磨刀不误砍柴工:取巧而已
    可视化组件:Swing JComponent
    软件简单升级方式:文件覆盖
    代码库工具:CVS
    多字符串查找算法:kmp与step
    格式化文本支持:JTextPane
  • 原文地址:https://www.cnblogs.com/lvzhanhui/p/xiaoqiaolv_hibernate.html
Copyright © 2020-2023  润新知