[编辑:显然,这只是数组的问题,FoxyBOA 的答案可能指向(甚至是)答案。]
我的问题与这些软件有关:Hibernate3+Annotation、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) 个元素的集合“权限”,其中只有四个不为空(数据库表中的四行属于该特定用户,所以这是正确的)。据我所知,我正在为 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