hibernate和Java.util.set问题

时间:2009-07-15 11:20:43

标签: java hibernate java-ee

我正在尝试从他们的主站点进行hibernate教程,并希望稍微改变一下,以了解与java.util.set接口有多少关系。我的映射是正确的,我可以在表中插入EVENT,PERSON和映射表PERSON_EVENT.Now我在表中插入了一些虚拟值,并在映射表中添加了它们的映射。我想显示所有注册到事件或更多事件的人的所有事件。使用此代码:

 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();
     }
}

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

之类的行
  

约瑟夫在opensouce活动中注册

它显示出类似的东西:

  

Joseph已注册domain.Event@18a8ce2

格式为mypackagename.myclassname@something。 当我评论迭代器部分ant取消注释到一个字符串数组时,我有一个例外:arraystoreexception。 我有点失落。我看不出这里有什么问题。请你看看我做错了什么?谢谢你的阅读。

3 个答案:

答案 0 :(得分:3)

这与Hibernate没有任何关系。你在Event对象上调用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();

答案 1 :(得分:1)

您看到domain.Event@18a8ce2的原因是这是调用Object.toString()的输出(即默认的toString()实现)。此实现以 @ 格式返回String。如果您希望查看事件的内部状态,则应覆盖Event类定义中的toString()方法:

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

ArrayStoreException的原因是yo u're trying to create a String [] but are passing in objects that are not字符串s (they're Event s)。来自ArrayStoreException Javadoc:

“抛出,表示已尝试将错误类型的对象存储到对象数组中。”

因此,您需要通过调用toArray(new Event[a.size()])来创建数组。

答案 2 :(得分:1)

您还没有向我们展示 Person Event 类的实现,所以我只能猜测。对我来说,看起来你没有覆盖 Event 类中的 toString 方法,因为输出看起来像继承自 toString 方法的结果对象