约束错误
问题描述:
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)
答
有两种方法可以在JPA中删除对象。
- 使用
EntityManager.remove(...)
。这将根据所需的级联设置级联 。 - 使用
Bulk Delete
查询。这将不级联和你基本上是说“相信我,我知道我在做什么”
你选择了后者,并尝试做你指示和失败的原因很明显,有是连接数据。使用第一个选项,或首先从受影响的Session对象中删除相关对象
session_contactmethods听起来像连接表吗?或者它是从字面上持有ContactMethod枚举/实体的表? – Gimby
那枚枚举表如何保留?它们完全依赖所有者......会话对象。 PS,你不需要在该领域的“targetClass”,你有泛型定义它 –
是的,我现在明白了,认为可能有另一个表涉及。无论如何,我怎么才能让删除工作呢?它是否需要额外的级联注释...我认为这不是必需的? – rich