[编辑:显然,这仅是数组的问题,FoxyBOA的答案可能直接指向(甚至是)答案.]
我的问题与以下软件有关:Hibernate3注释,Spring MVC,MySQL,在此示例中还包括Spring Security.
我想知道,为什么Hibernate自动关联的集合对于子表的每个行号都包含空值(除了正确的元素之外).我的例子:
我有一个用户和一个权限表,用户表的主键是用作外键的用户名.现在,我的权限表中有13行.当我从数据库(MySQL InnoDB)中检索用户时,Hibernate自动检索与该映射相对应的用户权限:
@OneToMany
@JoinColumn(name = "username")
@IndexColumn(name="id") // "id" was the primary key and is used to sort the elements
public Authority[] getAuthorities() {
return authorities;
}
public void setAuthorities(Authority[] authorities) {
this.authorities = authorities;
}
…最后,我得到一个包含14个(0-13)元素的“权威”集合,其中只有4个非空元素(数据库表中的四行属于该特定用户,所以是正确的).据我所知,我正在为诸如Fetchmode等属性使用Hibernate默认值.我正在这样获得用户:
Criteria criteria = getSession().createCriteria(User.class);
criteria.add(Restrictions.eq("username",username));
User user = (User) criteria.uniqueResult();
来自org.hibernate.loader.loader的日志记录信息正确地“提及”了结果集的四行.尽管如此,创建的用户仍然具有四个正确的元素以及数组中的十个空值.在我的特定示例中,这导致以下异常:
java.lang.IllegalArgumentException: Granted authority element 0 is null - GrantedAuthority[] cannot contain any null elements
解决方法:
我可以建议您检查数据.如果您有丢失的索引(本例中为id列),则数组中将为null而不是丢失的id.
即
table authorities:
username id
bob 1
bob 3
bob 5
结果,您将得到一个数组:
{0 = null,1 = bob,2 = null,3 = bob,4 = null,5 = bob}
更新:
我在两种情况下遇到了这种情况:
>权限表中索引列ID中缺少键值(例如0、1、3、4、5-丢失值2.Hibernate将自动添加到键值为2且值为空的数组值).
>索引值是按顺序排列的,但是选择标准过滤它们的一部分(例如,您的HQL与“从用户u加入u.authorities a where a.id = 2”类似).在这种情况下,休眠加载用户,但在权限数组中您将只有3个值:0-空,1-空,2-ID为2的权限.