这似乎应该是一个非常简单的问题,或者至少有一个简单的答案。但是 - 我真的不是数据库专家,而且我在 Hibernate 学习曲线上还差得很远。也就是说,这是设置:
考虑两个实体之间的单向多对多关系,从Foo
到Bar
:
(请原谅下面的任何错别字,以下显然是对实际代码的简化)
FooDTO.java:
@Entity
@Table(name = "MyDB.dbo.Foo")
class FooDTO implements Serializable
{
private int id;
private String name;
private Set<BarDTO> bars = new HashSet<BarDTO>();
...
@Fetch(FetchMode.JOIN)
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "MyDB.dbo.FooBar",
joinColumns = { @JoinColumn(name = "fooId") },
inverseJoinColumns = { @JoinColumn(name = "barId") })
public Set<BarDTO> getBars()
{
return bars;
}
public void setBars(Set<Bar> bars)
{
this.bars = bars;
}
}
BarDTO.java:
@Entity
@Table(name = "MyDB.dbo.Bar")
class BarDTO implements Serializable
{
private int id;
private String name;
...
}
在 TSQL 端,连接表是这样设置的:
CREATE TABLE [dbo].[FooBar](
[id] [int] NOT NULL IDENTITY PRIMARY KEY,
[fooId] [int] NOT NULL,
[barId] [int] NOT NULL,
CONSTRAINT fk_FooBar_FooId FOREIGN KEY (fooId) REFERENCES [dbo].[Foo](id),
CONSTRAINT fk_FooBar_BarId FOREIGN KEY (barId) REFERENCES [dbo].[Bar](id),
) ON [PRIMARY]
END
如果我尝试彻底删除 a BarDTO
,我会得到 a ,ConstraintViolationException
因为我没有先删除连接表中的行(duh)。
问题:
- 当我删除 a 时,我可以让 Hibernate 自动删除连接表中的行
Bar
吗?如何? - 如果没有,我如何选择所有
Foo
具有特定 s 的 sBar
,以便我可以Bar
从每个相关Foo
的 s 集中删除它Bar
?
关于后一个问题,我认为这可以通过 aNamedQuery
或使用 Criteria API 来完成,但我不知道具体如何编写这样的查询或应用哪些约束。我认为命名查询看起来像:
SELECT f FROM FooDTO f INNER JOIN ??? WHERE f.id = ???
但我不确定barId
参数会去哪里,或者如何加入FooBar
表格,因为我没有将它声明为实体。(旁注,我还记得以前尝试加入命名查询的问题 - 加入命名查询是不可能的吗?)