【问题标题】:Do update instead of delete/insert for @ElementCollection Map对@ElementCollection Map 进行更新而不是删除/插入
【发布时间】: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


【解决方案1】:

您同时使用 parent_id 和 locale 作为主键,但是无法通过 Embeddable 告诉 JPA 该信息:更新要求构造具有唯一标识它们的东西,以便 JPA 可以将它们与一个区别开来另一个并跟踪更改。 Embeddable 与此完全相反,说明这些构造没有自己的标识符,因此仅使用其父 ID。

您应该做的是使用 parent_id、语言环境字段作为主键使 MyEntityTranslations 成为一个实体,这样您的模型就会匹配您在数据库中设置的内容。

【讨论】:

  • 我明白你在说什么,但我希望避免让 MyEntityTranslations 成为一个实体。翻译仅作为实体的一部分存在,我希望实体负责填充地图。除了@Embeddable 之外,我还可以在 MyEntityTranslations 上添加什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多