Это мой первый пост здесь, надеюсь, я все делаю правильно. Дайте мне посмотреть, как я могу лучше объяснить мою проблему, чтобы вы, ребята, могли ее понять.
[Использование: Eclipse, Hibernate, Smartgwt, язык Java]
Помимо прочего, в моей базе данных есть 2 таблицы (postgreSQL), которые связаны друг с другом.
- OrganizerUsers (organizeruser_id [PK], user_id, organizer_id [FK]) - эти FK соотносят таблицу с двумя другими неважными.
- Конференции (conference_id [PK], название, organizeruser_id [FK])
По сути, мне нужно получить все строки в таблице Conferences . Поэтому я ожидаю, что после запроса я должен получить что-то вроде Set<Conferences>
, каждый объект в наборе, содержащий информацию в таблице.
Теперь я использую Hibernate и Smartgwt для создания этого веб-приложения (нового для них).
Мои файлы картирования были созданы автоматически в Eclipse. Мои файлы классов также были созданы автоматически при генерации кода Hibernate.
Заметил, что hibernate делает следующее: каждый объект в Set<Conferences>
является объектом Conferences и имеет 3 атрибута:
- int conference_id
- Заголовок строки
- Организатор пользовательского объекта
Этот последний объект в основном является соответствующим объектом, взятым из таблицы OrganizerUsers (и выбран в соответствии с отношением между Conferences и Organizerusers таблиц - соединение операция была сделана, в основном).
ЗАПРОС:
@SuppressWarnings("unchecked")
@Override
public List getConferences() throws IllegalArgumentException {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = null;
List conferences = null;
try{
transaction = session.beginTransaction();
conferences = session.createQuery("from Conferences").list();
transaction.commit();
}catch(Exception e){
transaction.rollback();
e.printStackTrace();
}
finally {
session.close();
}
return conferences;
}
Результат отправляется через RPC (в smartgwt) клиенту (веб-странице). Этот запрос в основном является частью своего рода сервлета.
РЕЗУЛЬТАТ:
Клиент получает объект конференции Set<Conferences>
. При выводе данных на веб-страницу я замечаю:
Set<Conferences> conferences = [the result from the RPC call];
conferences.getTitle() //works fine, returns title
conferences.getConferenceId() //works fine, returns the id
conferences.getOrganizeruser() //**NULL OBJECT**
confereces.getOrganizeruser () должен был вернуть действительный объект, взятый из таблицы organizeruser . Там есть соответствующая действительная строка.
Это всего лишь пример, но везде, где у меня есть отношения с FK между двумя таблицами, я получаю эту проблему.
Выполнение HQL-запроса в этом встроенном редакторе HQL для того же примера, похоже, дает мне правильную информацию, хотя o_O [во вкладке Hibernate Configurations]. Это причина гибернации или ... вызов RPC SmartGwt? Я сомневаюсь.
Кстати, раньше у меня была похожая проблема с нулевым набором, выводимым после запроса. Я исправил это, извлекая его охотно, а не лениво (по умолчанию). Но я не получил это на работу.
Дополнительная информация:
Файл сопоставления Conferences.hbm.xml [отредактировано - вырезать неважные вещи и перевести имена классов, написанные в RO]
<hibernate-mapping>
<class name="com.test.project.shared.Conferences" table="conferences" schema="public">
<id name="conferenceId" type="int">
<column name="conference_id" />
<generator class="assigned" />
</id>
<many-to-one name="organizerusers" class="com.test.project.shared.Organizerusers" fetch="select">
<column name="organizerusers_id" not-null="true" />
</many-to-one>
<property name="title" type="string">
<column name="title" />
</property>
</class>
</hibernate-mapping>
Conference.java class [отредактировано - вырезать неважные вещи и перевести имена классов, написанные в RO]
@Entity
@Table(name = "conferences", schema = "public")
public class Conferinte extends LightEntity implements java.io.Serializable {
private int conferenceId;
private Organizerusers organizerusers;
private String title;
public Conferences() {
}
public Conferences(int conferenceId, Organizerusers organizerusers{
this.confereceId = conferenceId;
this.organizerusers = organizerusers;
}
public Conferences(int conferenceId, Organizerusers organizerusers, String title){
this.conferenceId = conferenceId;
this.organizerusers = organizerusers;
this.title = title;
}
@Id
@Column(name = "conference_id", unique = true, nullable = false)
public int getConferenceId() {
return this.conferenceId;
}
public void setConferenceId(int conferenceId) {
this.conferenceId = conferenceId;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "organizeruser_id", nullable = false)
public Organizerusers getOrganizerusers() {
return this.organizerusers;
}
public void setOrganizerusers(
Organizerusers organizerusers) {
this.organizerusers = organizerusers;
}
@Column(name = "title")
public String getTitle() {
return this.title;
}
public void setTitle(String title) {
this.title = title;
}
}