数据库查询后的空对象(使用hibernate + smartgwt)

时间:2011-06-17 03:45:12

标签: hibernate object null smartgwt

这是我在这里的第一篇文章,希望我做得对。让我看看如何更好地解释我的问题,以便你们能够理解它。

[使用:Eclipse,Hibernate,Smartgwt,Java语言]

其中,我的数据库中有2个表(postgreSQL),它们彼此相关。

  • OrganizerUsers (organizeruser_id [PK],user_id,organizer_id [FK]) - 这些FK将表格与其他2个不重要的表格相关联。
  • 会议(conference_id [PK],title,organizeruser_id [FK])

基本上,我需要获取会议表中的所有行。所以我希望在查询之后,我应该得到像 Set<Conferences> 这样的东西,集合中的每个对象都包含表格中的信息。 现在,我正在使用Hibernate和Smartgwt来构建这个Web应用程序(对他们来说是新的)。 我的映射文件是在Eclipse中自动创建的。我的类文件也是由Hibernate的代码生成自动创建的。 注意到hibernate执行以下操作:Set<Conferences>中的每个对象都是会议对象,它有3个属性:

  • int conference_id
  • 字符串标题
  • Organizeruser对象

最后一个对象基本上是取自 OrganizerUsers 表的相应对象(并根据会议 Organizerusers 表之间的关系选择) - 基本上是一个加入操作。

QUERY:

@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中)发送到客户端(网页)。上面的查询基本上是一种servlet的一部分。

结果:

客户端收到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配置选项卡中]为我提供了正确的信息。是导致休眠还是...... SmartGwt RPC调用?我对此表示怀疑。 通过这种方式,我之前遇到过类似的问题,在查询之后输出了一个空集。我通过急切地取而不是懒惰来修复它(默认)。但我没有让它发挥作用。

其他信息: 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类 [编辑 - 删除了不重要的东西,并翻译了用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 :(得分:0)

This link帮助我解决了问题。所以,如果有人有类似的问题,我建议你开始在那里阅读(太糟糕了,我之前没有找到)。