我有两个表格:用户和角色。用户和角色之间具有多对一关系(一个用户可以包含许多角色)
我使用SQL查询将数据插入到User表中,并将role_id(假设Role表的pk)作为外键。
现在,当我尝试获取具有特定角色的用户记录时。
我正在使用以下代码来获取User对象。
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>
有没有办法防止它发生? 这可能是有时候select查询会给我输出,有时候会为null。
答案 0 :(得分:0)
您的设计似乎存在根本性错误。您声明一个用户可以包含许多角色。这意味着外键(指向用户的PK)应该在角色中。但是您似乎已将外键放在User中。
答案 1 :(得分:0)
除了DUKE回答之外,谁清楚地指出您的映射表明角色有许多用户而不是您的要求,您的代码仍然存在一些问题:
首先你需要添加inverse =&#34; true&#34;对你的一对多方面。由于您有双向关联,因此只有一方可以拥有这种关系:
<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();