[英]How do I delete a row in a join table automatically, to avoid a ConstraintViolationException?
這似乎應該是一個非常簡單的問題,或者至少有一個簡單的答案。 但是 - 我真的不是一個數據庫人,而且我在Hibernate學習曲線上的表現還很不錯。 也就是說,這是設置:
考慮兩個實體之間的單向多對多關系,從Foo
到Bar
:
(請原諒以下任何拼寫錯誤,以下顯然是對實際代碼的簡化)
@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;
}
}
@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
如果我試圖直接刪除BarDTO
,我會得到一個ConstraintViolationException
因為我沒有先刪除連接表中的行(duh)。
Bar
時,我可以讓Hibernate自動刪除連接表中的行嗎? 怎么樣? Bar
所有Foo
,所以我可以從每個相關Foo
的Bar
s中刪除該Bar
? 關於后一個問題,我認為可以使用NamedQuery
或使用Criteria API來完成,但我不知道如何編寫這樣的查詢或應用哪些約束。 我認為命名查詢看起來像是這樣的:
SELECT f FROM FooDTO f INNER JOIN ??? WHERE f.id = ???
但是我不確定barId
參數會去哪里,或者如何加入FooBar
表,因為我沒有將它聲明為實體。 (旁注,我還記得以前嘗試加入命名查詢的問題 - 加入命名查詢是不可能的?)
當我刪除一個Bar時,我可以讓Hibernate自動刪除連接表中的行嗎? 怎么樣?
您需要從FooDTO
中的集合中刪除BarDTO
實例,該集合中FooDTO
的引用。
如果沒有,我如何選擇所有具有特定條形的Foo,這樣我就可以從每個相關Foo的條形圖中刪除該條形圖?
以下應該有效:
SELECT f FROM FooDTO f WHERE :bar MEMBER OF f.bars
或者你可以使關聯雙向,只需調用bar.getFoos()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.