Hibernate连接表限制

时间:2011-12-09 00:53:06

标签: java hibernate

我有以下表格:

[table:column1,column2]

A:id,name

B:id,name

AB:idA,idB

AB是一个连接表。

然后我在hibernate类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()

的目的

是否有可能构建一个标准/限制条款来实现这一目标?

1 个答案:

答案 0 :(得分: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
}

现在获取给定B的所有A只需要在getBs()个实例上调用A。您也可以创建条件/编写HQL来实现这一点 - 从任何一方开始。