我正在尝试从他们的主站点进行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。 我有点失落。我看不出这里有什么问题。请你看看我做错了什么?谢谢你的阅读。
答案 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 方法的结果对象的