我正在尝试使用hibernate在视图和表之间进行查询。
我准备3个投影,例如SELECT id, name, storages
hibernate实体
@Entity
@Table(name = "cl_libraryWithItems_view")
public class LibraryWithItemsViewModel implements Serializable {
.... other columns
@ManyToMany(fetch = FetchType.EAGER)
@ForeignKey(name = "fk_library_id", inverseName = "fk_storage_id")
@JoinTable(name = "cl_library_storage",
joinColumns = {@JoinColumn(name="library_id")},
inverseJoinColumns = {@JoinColumn(name="storage_id")})
Set<StorageModel> storages = new HashSet<StorageModel>();
第二个实体(我只包括相关列)
@Entity
@Table(name = "cl_storage")
public class StorageModel implements Serializable {
@ManyToMany(mappedBy = "storages")
private final Set<LibraryModel> libraries = new HashSet<LibraryModel>();
}
我得到ArrayIndexOutOfBoundsException
。我在引擎盖下看了一眼,看来错误在下面的地方抛出。
在SimpleProjection.java
第90行,存储列的列数为0.对于前两列,我得到1.
int numColumns = getColumnCount( criteria, criteriaQuery );
在同一档案中,其他地方,
public int getColumnCount(Criteria criteria, CriteriaQuery criteriaQuery) {
Type types[] = getTypes( criteria, criteriaQuery );
int count = 0;
for ( int i=0; i<types.length; i++ ) {
count += types[ i ].getColumnSpan( criteriaQuery.getFactory() );
}
return count;
}
这会使CriteriaLoader
中的第164行混乱(这里会抛出越界)
result[i] = types[i].nullSafeGet(rs, columnAliases[pos], session, null);
另一个细节,在CollectionType.java
中getColumnSpan返回0.由于我们期待收集,此方法被触发,并返回0.
public int getColumnSpan(Mapping session) throws MappingException {
return 0;
}
所以问题似乎是,我们的列是一个集合,而getColumnSpan返回0.
现在的问题是如何解决它。我需要做什么,因此我可以成功预测storages
列?
感谢。
答案 0 :(得分:0)
设置ManyToMany双向关系并避免很多问题的最好方法是创建第三个映射到实体的表,这个实体必须有ManyToOne到每个表
该表必须具有由两个字段组成的复合主键,其名称如下:table1_primarikeyoftable1和table2_primarykeyoftable2 和那些表中的两个外键 它工作正常,如果需要,你可以在第三个表中添加一些其他字段。
答案 1 :(得分:0)
我做的事真的很傻。
我想进行双向映射,但我所做的并不是双向映射。
LibraryWithItemsViewModel
有一组StorageModel
。 StorageModel
也需要有一组LibraryWithItemsViewModel
。
此问题随着此更改而消失。更多的龙潜伏......但是另一天的故事。