hibernate и проблема Java.util.set - PullRequest
1 голос
/ 15 июля 2009

Я пробую учебники по спящему режиму с их основного сайта и хотел немного изменить ситуацию, чтобы знать, как много-много отношений работают с интерфейсом java.util.set. Мои отображения верны, и я могу вставить их в таблицы и из таблиц EVENT, PERSON и таблица сопоставлений PERSON_EVENT. Теперь я вставил несколько фиктивных значений в таблицы и добавил их сопоставления в таблицу сопоставлений. Я хотел отобразить все события всех людей, которые зарегистрированы в событии или более. с этим кодом:

 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

это скорее показывает что-то вроде:

Джозеф зарегистрирован на домен.Event@18a8ce2

это формат mypackagename.myclassname@something. когда я комментирую часть итератора и удаляем комментарий приведения к строковому массиву, у меня возникает исключение: arraystoreexception. Я немного потерян. Я не вижу, что здесь не так. Пожалуйста, посмотрите, скажите, что я сделал не так? Спасибо за чтение.

Ответы [ 3 ]

3 голосов
/ 15 июля 2009

Это на самом деле не имеет ничего общего с Hibernate.Вы вызываете toString () для объекта Event:

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

Вы также можете улучшить свой HQL-запрос HQL, предварительно загрузив события.В настоящее время они будут загружаться с отложенной загрузкой, поэтому вы получите дополнительный запрос для каждого человека (при условии, что вы не задали стратегию извлечения в файле сопоставления).

Попробуйте что-то вроде:

List<Person> persons = session.createQuery("from Person p left join fetch p.events").list();
1 голос
/ 15 июля 2009

Вы не показали нам свою реализацию классов Person и Event , так что я могу только догадываться. Мне кажется, что вы не переопределили метод toString в Event классе, так как результат выглядит как результат метода toString , унаследованного от Объект

1 голос
/ 15 июля 2009

Причина, по которой вы видите domain.Event@18a8ce2, заключается в том, что это результат вызова Object.toString() (т.е. реализации toString() по умолчанию). Эта реализация возвращает строку в формате @ . Если вы хотите увидеть внутреннее состояние события, вам следует переопределить метод toString () в определении класса Event:

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

Причина ArrayStoreException в том, что вы u're trying to create a String [] but are passing in objects that are not String s (they're Event s). Из ArrayStoreException Javadoc:

«Брошено, чтобы указать, что была предпринята попытка сохранить объект неправильного типа в массиве объектов.»

Итак, вам нужно создать свой массив, вызвав toArray(new Event[a.size()]).

...