簡體   English   中英

如何自動刪除連接表中的行,以避免出現ConstraintViolationException?

[英]How do I delete a row in a join table automatically, to avoid a ConstraintViolationException?

這似乎應該是一個非常簡單的問題,或者至少有一個簡單的答案。 但是 - 我真的不是一個數據庫人,而且我在Hibernate學習曲線上的表現還很不錯。 也就是說,這是設置:

考慮兩個實體之間的單向多對多關系,從FooBar

(請原諒以下任何拼寫錯誤,以下顯然是對實際代碼的簡化)

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

如果我試圖直接刪除BarDTO ,我會得到一個ConstraintViolationException因為我沒有先刪除連接表中的行(duh)。

問題:

  • 當我刪除一個Bar時,我可以讓Hibernate自動刪除連接表中的行嗎? 怎么樣?
  • 如果沒有,我如何選擇具有特定Bar所有Foo ,所以我可以從每個相關FooBar 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM