选择查询上的 Hibernate-外键对象 Null

Posted

技术标签:

【中文标题】选择查询上的 Hibernate-外键对象 Null【英文标题】:Hibernate-Foreign key object Null on Select Query 【发布时间】:2014-11-25 13:10:24 【问题描述】:

我有两个表,例如:用户和角色。用户和角色之间存在多对一关系(一个用户可以包含多个角色)

我使用 SQL 查询将数据插入到 User 表中,其中 role_id(假设角色表的 pk)作为外键。

现在,当我尝试获取具有特定角色的用户的记录时。

我正在使用以下代码来获取用户对象。

User user=(User)session.get('User.class',user_id);

Role role=user.getRole();

在执行上述行时,有时我得到了用户对象,有时没有。 对象之间的关系映射如下。

  <many-to-one name="role" class="com.example.Role" fetch="select">

        <column name="role_id" precision="14" scale="0" />

    </many-to-one>

<set name="user" cascade="delete" table="User" >
      <key>
            <column name="role_id" not-null="true" />
      </key>
      <one-to-many class="com.example.User" />
</set>

有什么方法可以防止它发生吗? 是否有可能有时选择查询会给我输出,有时会为空。

【问题讨论】:

【参考方案1】:

您的设计似乎存在根本性错误。您说一个用户可以包含多个角色。这意味着外键(指向用户的 PK)应该在角色中。但是您似乎已将外键放在用户中。

【讨论】:

抱歉描述有误。但表格之间的关系在技术上是正确的。【参考方案2】:

除了 DUKE 回答明确指出您的映射表明角色有很多用户而不是您的要求之外,您的代码仍然存在一些问题:

首先,您需要将 inverse="true" 添加到您的一对多端。由于您具有双向关联,因此只有一方可以拥有该关系:

  <set name="user" cascade="delete" table="User" inverse="true">
        <key>
              <column name="role_id" not-null="true" />
        </key>
        <one-to-many class="com.example.User" />
  </set>

然后在与用户相同的查询中获取角色会更有效:

 User user = (User) 
      session.createQuery(
          "select u from User left join fetch u.role where u.id = :user_id')
      .setParameter("user_id", user_id)
      .uniqueResult();

【讨论】:

感谢您的 commnet。我将尝试使用 inverse="true" 选项。

以上是关于选择查询上的 Hibernate-外键对象 Null的主要内容,如果未能解决你的问题,请参考以下文章

Criteria API JPA Hibernate:外键上的不同选择

Hibernate中fetch和lazy介绍

Hibernate中fetch和lazy介绍

hibernate 一对多双向关联 外键值为空 怎么结决?

[解决方法]Hibernate查询部分字段(含外键)出错,报空指针异常

hibernate N+1 查询