zoukankan      html  css  js  c++  java
  • 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、两中异常经常出现在一对多映射和多对多映射中

     

    我很小我很弱,我在慢慢成长!
  • 相关阅读:
    asp生成随机密码
    ASP用FSO生成HTML简单实例+详解 asp生成html 空白
    jquery ajax
    js屏蔽F5 兼容ie和firefox
    VS2003+SQL Server2000环境下出现的“未将对象引用设置到对象的实例”错误
    Hibernate开发笔记
    用SETUP FACTORY制作安装程序
    SPRING jdbc THIN方式 访问ORACLE数据库慢的解决方案
    JAVA如何调用DOS命令(转载)
    在WEBLOGIC9.1上部署SPRING+WEBWORK 的WEB应用
  • 原文地址:https://www.cnblogs.com/lvzhanhui/p/xiaoqiaolv_hibernate.html
Copyright © 2011-2022 走看看