Eclipselink JPA - 使用@EmbeddedCollection和map更新实体不会插入新条目

时间:2016-04-19 14:13:49

标签: jpa spring-boot eclipselink spring-data-jpa

我正在查看一个非常简单的实体Map @ElementCollection

实体:

@Entity
@RequiredArgsConstructor @NoArgsConstructor @Data
public class Attribute {

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

    @NonNull
    private String name;

    @ElementCollection
    private Map<Integer, AttributeValue> attributes = new HashMap<>();
}

Embeddable用作地图值:

@Embeddable
@RequiredArgsConstructor @NoArgsConstructor(access = PRIVATE) @Data
public class AttributeValue {

    @NonNull
    private String name;
}

当我尝试使用新的映射条目更新实体时,其中已存在相等的持久值(在这种情况下具有相同的name),未插入映射条目。

此测试再现了此问题:

@Test
    public void should_persist_attribute_with_same_value() {
        Attribute name = new Attribute("name");

        name.getAttributes().put(1, new AttributeValue("1"));
        name.getAttributes().put(2, new AttributeValue("2"));

        name = attributeRepository.saveAndFlush(name);

        name.getAttributes().put(3, new AttributeValue("2")); //this value is already in the map and is not inserted
        name.getAttributes().put(4, new AttributeValue("4"));

        name = attributeRepository.saveAndFlush(name);

        entityManager.clear();
        //the assertion fails and finds only three items (with key 1,2 and 4)
        then(attributeRepository.findOne(name.getId()).getAttributes()).hasSize(4);
    }

似乎eclipselink中存在一个错误,它忽略了已经与地图中另一个地图关键字一起使用的地图值。

我也尝试过使用hibernate - 相同的代码按预期工作。

有什么想法吗?

我正在使用:

  • spring-boot 1-4-0.M2
  • spring-data-jpa 1.10.1.RELEASE
  • eclipselink 2.6.1

0 个答案:

没有答案