Нулевые объекты после запроса к базе данных (используя hibernate + smartgwt) - PullRequest
1 голос
/ 17 июня 2011

Это мой первый пост здесь, надеюсь, я все делаю правильно. Дайте мне посмотреть, как я могу лучше объяснить мою проблему, чтобы вы, ребята, могли ее понять.

[Использование: 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;
    }

}

1 Ответ

0 голосов
/ 18 июня 2011

Эта ссылка помогла мне решить мою проблему.Так что, если есть кто-то, у кого есть подобная проблема, я рекомендую вам начать читать там (очень жаль, что я не нашел это ранее).

...