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、两中异常经常出现在一对多映射和多对多映射中

     

    我很小我很弱,我在慢慢成长!
  • 相关阅读:
    js正则表达式中的问号使用技巧总结
    380. Insert Delete GetRandom O(1)
    34. Find First and Last Position of Element in Sorted Array
    162. Find Peak Element
    220. Contains Duplicate III
    269. Alien Dictionary
    18. 4Sum
    15. 3Sum
    224. Basic Calculator
    227. Basic Calculator II
  • 原文地址:https://www.cnblogs.com/lvzhanhui/p/xiaoqiaolv_hibernate.html
Copyright © 2011-2022 走看看