我正在查看一个非常简单的实体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 - 相同的代码按预期工作。
有什么想法吗?
我正在使用: