【问题标题】:Hibernate join table restrictionsHibernate 连接表限制
【发布时间】:2011-12-09 00:53:05
【问题描述】:

我有以下表格:

[表:column1,column2]

A : id, 名字

B : id, 名字

AB : idA, idB

AB 是一个连接表。

然后我在hibernate class B上有这个方法

@OneToMany( fetch = FetchType.EAGER)
@JoinTable( name = "AB", 
            joinColumns = @JoinColumn( name = "idB"),
            inverseJoinColumns = @JoinColumn( name = "idA") )
public List<A> getAs(){
    //return the list of matching stuff
}

这很好用。

现在我想在hibernate中做这个sql查询:

select * from B inner join AB on B.id = AB.idB where AB.idA = 1234

基本上,'列出所有引用 A 且 ID 为 1234 的 B'

我可以直接执行 sql,但这会破坏 getAs() 的目的

是否可以构造一个 Criterion/Restriction 子句来实现这一点?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    AB 之间的关系在这种情况下不是一对多,而是多对多。你应该这样映射它:

    @ManyToMany
    @JoinTable(name = "AB", 
                joinColumns = @JoinColumn( name = "idB"),
                inverseJoinColumns = @JoinColumn( name = "idA") )
    public List<A> getAs(){
        //return the list of matching stuff
    }
    

    请注意,在大多数情况下急切地获取集合并不是一个好主意,因此上面删除了fetch = FetchType.EAGER。你现在可以在A 端做同样的事情来建立双向关系:

    @ManyToMany(mappedBy='As')
    public List<B> getBs(){
        //return the list of matching stuff
    }
    

    现在获取给定A 的所有Bs 只需在A 实例上调用getBs()。您也可以创建条件/编写 HQL 来执行此操作 - 从任一方面。

    【讨论】:

    • 有道理。顺便说一句,如果我离开 fetch = FetchType.EAGER,会发生什么?
    • @Ken Eager fetch 意味着当您尝试获取您的B 时,Hibernate 将尝试检索所有关联的As。如果A 也将其Bs 集合映射到急切获取,则同样适用,依此类推。将所有 fetches 设置为 eager 很容易导致您每次获取单个实体时都检索整个数据库。
    • 集合属性默认被视为LAZY,这是由 JPA 规范规定的。
    • @ChssPly76 为什么你认为这一定是ManyToMany 关系?
    • @Piotr - Ken 在B 上将其映射为一对多,他询问如何为给定的A 获取多个Bs。这是多对多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多