2016-11-22 134 views
0

JPQL:約束錯誤

delete from Session where deviceId=:deviceId and username=:username 

錯誤:

org.hibernate.engine.jdbc.spi.SqlExceptionHelper: ERROR: update or delete on table "edge_session" violates foreign key constraint "fkh7j6o58rfwfumainodrxptobt" on table "session_contactmethods" 

會話類:

@Entity 
@Table(name="EDGE_SESSION") 
public class Session { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 

    @ElementCollection(targetClass=ContactMethod.class) 
    @Enumerated(EnumType.STRING) 
    private Set<ContactMethod> contactMethods; 

... 
} 

我應該添加特定CascadeTypes到contactMethods場?因爲外表持有一個枚舉,我假設刪除應該可以不發生,因爲我希望枚舉的列表保留下來?

編輯:看起來好像它創建的session_contactmethods表不僅僅是枚舉值,而是與會話的連接鍵。

# \d session_contactmethods 
     Table "public.session_contactmethods" 
    Column  |   Type   | Modifiers 
----------------+------------------------+----------- 
session_id  | bigint     | not null 
contactmethods | character varying(255) | 
Foreign-key constraints: 
    "fkh7j6o58rfwfumainodrxptobt" FOREIGN KEY (session_id) REFERENCES edge_session(id) 

# select * from session_contactmethods; 
session_id | contactmethods 
------------+---------------- 
      1 | EMAIL 
      1 | TELEPHONE 
      2 | TELEPHONE 
      2 | EMAIL 
(4 rows) 
+0

session_contactmethods聽起來像連接表嗎?或者它是從字面上持有ContactMethod枚舉/實體的表? – Gimby

+0

那枚枚舉表如何保留?它們完全依賴所有者......會話對象。 PS,你不需要在該領域的「targetClass」,你有泛型定義它 –

+0

是的,我現在明白了,認爲可能有另一個表涉及。無論如何,我怎麼才能讓刪除工作呢?它是否需要額外的級聯註釋...我認爲這不是必需的? – rich

回答

2

有兩種方法可以在JPA中刪除對象。

  1. 使用EntityManager.remove(...)。這將根據所需的級聯設置級聯 。
  2. 使用Bulk Delete查詢。這將不級聯和你基本上是說「相信我,我知道我在做什麼」

你選擇了後者,並嘗試做你指示和失敗的原因很明顯,有是連接數據。使用第一個選項,或首先從受影響的Session對象中刪除相關對象