代码之家  ›  专栏  ›  技术社区  ›  black sensei

休眠和java.util.set问题

  •  1
  • black sensei  · 技术社区  · 16 年前

    我正在从他们的主站点尝试Hibernate教程,我想稍微改变一下,以了解有多少对多的关系可以通过java.util.set接口工作。我的映射是正确的,我可以在表事件、人员和映射表人员事件中插入和插入。现在,我在表中插入了一些虚拟值,并添加了它们的映射。在映射表中,我想显示所有注册到一个或多个事件的人的所有事件。使用此代码:

     public void ShowPersonEvents()
     {
         Person aperson;
         Event anEvent;
         Session session = HibernateUtil.getSessionFactory().getCurrentSession();
         session.beginTransaction();
         List<Person> persons = session.createQuery("from Person").list();
         for(int i =0; i< persons.size(); i++)
         {
             aperson = (Person) persons.get(i);
             Set a = aperson.getEvents();
    //            String[] events = (String[])a.toArray(new String[a.size()]);
    //             for (String e : events)
    //             {
    //                 System.out.println(aperson.getLastname()+" is registerd to the" + e);
    //
    //             }
             Iterator it = a.iterator();
             while(it.hasNext())
             {
                 System.out.println(aperson.getLastname()+" is registerd to the" +(String) it.next().toString());
             }
    
    //                System.out.println();
             }
             session.getTransaction().commit();
         }
    }
    

    因此,当我运行who时,是正确的行数,而不是显示,例如:

    Joseph已注册参加OpenSouce活动

    它更像是显示:

    Joseph已注册到域。event@18A8ce2

    这是myPackageName.myClassName@something格式。 当我注释迭代器部分时,取消对字符串数组的强制转换的注释,我有一个异常:arraystoreException。 我有点迷路了。我看不出这里有什么问题。请你看看,告诉我我做错了什么?谢谢你的阅读。

    3 回复  |  直到 16 年前
        1
  •  3
  •   geofflane    16 年前

    这与冬眠没有任何关系。您正在对事件对象调用ToString():

    (String) it.next().toString()
    

    您还没有重写event.toString()方法,因此得到了默认的实现。相反,尝试以下方法:

    while(it.hasNext()) {
        Event event = (Event) it.next();
        System.out.println(aperson.getLastname()+" is registerd to the" + event.getName());
    }
    

    您还可以通过预取事件来改进Hibernate HQL查询。现在看来,它们将被懒惰地加载,因此您将为每个人获得一个额外的查询(假设您没有在映射文件中设置提取策略)。

    尝试以下方法:

    List<Person> persons = session.createQuery("from Person p left join fetch p.events").list();
    
        2
  •  1
  •   Tadeusz Kopec for Ukraine yespbs    16 年前

    您还没有向我们展示 事件 所以我只能猜测。在我看来,你还没有被超越 弦线 方法在 事件 类,因为输出看起来像 弦线 方法继承自 对象

        3
  •  1
  •   Adamski    16 年前

    你看到的原因 domain.Event@18a8ce2 这是调用的输出吗? Object.toString() (即违约 toString() 实施)。此实现返回格式为的字符串 @ . 如果要查看事件的内部状态,应重写事件类定义中的ToString()方法:

    public String toString() {
      return String.format("Event{ID: %d, Title: %s, Date: %s}", id, title, date);
    }
    

    原因是 ArrayStoreException 是哟 u're trying to create a 字符串[ ] but are passing in objects that are not s (they're Event s)。从 ArrayStoreException(阵列存储异常) Javadoc:

    “引发以指示已尝试将错误类型的对象存储到对象数组中。”

    所以您需要通过调用 toArray(new Event[a.size()]) .