hibernate:与View和table的多对多关系

时间:2014-12-16 01:43:36

标签: java hibernate hibernate-mapping hibernate-criteria

我正在尝试使用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列?

感谢。

2 个答案:

答案 0 :(得分:0)

设置ManyToMany双向关系并避免很多问题的最好方法是创建第三个映射到实体的表,这个实体必须有ManyToOne到每个表

该表必须具有由两个字段组成的复合主键,其名称如下:table1_primarikeyoftable1和table2_primarykeyoftable2  和那些表中的两个外键 它工作正常,如果需要,你可以在第三个表中添加一些其他字段。

答案 1 :(得分:0)

我做的事真的很傻。

我想进行双向映射,但我所做的并不是双向映射。

LibraryWithItemsViewModel有一组StorageModelStorageModel也需要有一组LibraryWithItemsViewModel

此问题随着此更改而消失。更多的龙潜伏......但是另一天的故事。

相关问题