【发布时间】:2015-10-19 15:36:00
【问题描述】:
我有一个定义了以下映射的实体:
@ElementCollection(fetch=FetchType.LAZY, targetClass=MyEntityTranslations.class)
@CollectionTable(name="MY_ENTITY_TRANSLATIONS", joinColumns=@JoinColumn(name="PARENT_ID"))
@MapKeyColumn(name="LOCALE")
private Map<String, MyEntityTranslations> translations;
MyEntityTranslations 类如下所示:
@Embeddable
public class MyEntityTranslations
{
@Column(name="NAME")
private String name;
@Column(name="DESCRIPTION")
private String description;
public MyEntityTranslations()
{
}
//getters and setters
}
MY_ENTITY_TRANSLATIONS 表如下所示:
CREATE TABLE MY_ENTITY_TRANSLATIONS
(
parent_id bigint NOT NULL,
locale character varying NOT NULL,
name character varying,
description character varying,
CONSTRAINT my_entity_translations_pkey PRIMARY KEY (parent_id, locale)
);
一切正常,如预期的那样,但是当我更新 MyEntityTranslations 中的名称或描述时,它正在执行 DELETE,然后执行 INSERT 而不仅仅是 UPDATE。
我想也许将equals() 和hashCode() 方法添加到MyEntityTranslations 可以让JPA 知道它是否应该简单地更新。然而,我很快意识到MyEntityTranslations 中没有必要的信息来正确覆盖这些方法。
在谷歌上搜索了这个问题之后,我发现很多地方都用List 解决了这个问题,解决方案是添加@OrderColumn 注释或将其更改为Set。但是,对于Map,我找不到任何关于此的信息。
确实,在将一条记录插入到 MY_ENTITY_TRANSLATIONS 表中之后,它永远不需要删除,除非删除了 id 等于 PARENT_ID 列的实体。我可以对实体或可嵌入对象做些什么来让 JPA 始终执行更新而不是删除/插入行为?
以防万一,我使用的是 PostgreSQL、Spring Data JPA 和 EclipseLink。
【问题讨论】:
-
你应该提到你的 JPA 提供者 - 因为这个问题是特定于实现的。
-
@TobiasLiefke 我已经用该信息 (EclipseLink) 更新了问题。
-
我在使用 List 时遇到了类似的问题,尝试使用 Set 作为替代方案,但发生了相同的行为。
标签: java postgresql jpa eclipselink spring-data-jpa