2014-03-13 43 views
0

我們有一個多對多的關係,比如Entity1和Entity2。JPA ManyToMany過濾器鏈接表

現在,當我們刪除一個Entity2的元素時,我們實際上並沒有將它從數據庫中刪除,而只是將一個字段「isActive」設置爲false。

當發生這種情況時,我們希望刪除Entity1的任何元素與被刪除的Entity2的元素之間的所有關係。

在SQL中,這會轉換爲entity1表,entity2表和entity1TOentity2表。在SQL我們可以簡單地做一個更新,

delete from entity1TOentity2 where entity2ID = :entity2Id 

在JPA中,我們可以加載的對象ENTITY1的所有元素,與連接抓取的關係,然後通過一個Java中的連接刪除一個,但它是非常浪費......

有沒有什麼辦法用JPAQL來制定SQL查詢?

我知道這是可能的explicitly define a link entity, and make JPA use it,那麼我想我可以運行一個基本上與該鏈接實體上的SQL相同的查詢,但它似乎有點矯枉過正。

我缺少一個像原始SQL一樣好的解決方案,但使用JPA API/JPAQL?

回答

1

根據您的上下文,我只看到一個選項:原生查詢。

+0

你叫什麼多到許多實體的擁有者?在這裏我有Entity1和Entity2。如果這就是你的意思,我沒有明確地定義一個實體Entity1toEntity2? –

+0

關係的所有者是具有'@ ManyToMany'註釋的實體,沒有'mappedBy'元素。是的,這就是我的意思(即你不需要Entity1toEntity2實體)。 –

+0

我有Entity1。 DB中有很多元素,很多記錄。我提到了將它們全部取出並逐個刪除連接的可能性。但是你說這不是你的建議。有實體,但我需要在記錄上處理元素。所以我不遵循。 –

1

在純粹的JPA上,我不知道乾淨的方式來做到這一點。
如果您使用Hibernate在幕後,有一個高層次的解決方案:

@Entity 
@Where(clause='isActive=true') 
public class Entity2{ 
} 
+0

謝謝你,這很有趣。我們在JPA下使用hibernate,但試圖不依賴它,所以我們可能不會利用它。我不確定,但它可能甚至可能只用於關係,這將是非常好的情況下,類似的東西:http://stackoverflow.com/a/7701696/516188雖然那是OneToMany,而不是ManyToMany 。 –

+0

它可以像你想要的那樣使用。我甚至在編輯它之前將它包含在我的答案中。但是我認爲如果你設置了isActive = false,你不希望這個實體獲取它的任何關係,所以最好把它放在實體的頂部。 –