约束错误

问题描述:

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

有两种方法可以在JPA中删除对象。

  1. 使用EntityManager.remove(...)。这将根据所需的级联设置级联 。
  2. 使用Bulk Delete查询。这将不级联和你基本上是说“相信我,我知道我在做什么”

你选择了后者,并尝试做你指示和失败的原因很明显,有是连接数据。使用第一个选项,或首先从受影响的Session对象中删除相关对象