我有这样的JPA实体:
@Entity
@Table(name = "ATTRIBUTE")
public class Attribute {
//ID stuff
@Column(name = "NAME", nullable = false)
private String name;
@Column(name = "VALUE", nullable = false)
private String value;
//getters and setters
}
另一个实体:
@Entity
@Table(name = "ATTRIBUTE_GROUP")
public class AttributeGroup {
//ID stuff
@ElementCollection(fetch = FetchType.LAZY, targetClass = java.lang.String.class)
@CollectionTable(name = "ATTRIBUTE")
@MapKeyColumn(name = "NAME")
@Column(name = "VALUE")
private Map<String, String> attributes = new HashMap<>();
public void createAttribute(String name, String value) {
Attribute attribute = new Attribute();
attribute.setName(name);
attribute.setValue(value);
attribute.setAttributeGroup(this);
attributes.put(name, value);
}
public Map<String, String> getAttributes() {
return attributes;
}
}
我需要在AttributeGroup
实体中有一张地图,其中Attribute
的名称为关键,Attribute
的值为值。
目前的做法对我不起作用。当我尝试将记录持久保存到数据库时,它会生成异常,即事务仅标记为roolback。我不知道这是否是写作方式,如果它不起作用,显然它不是。
如何在JPA中实现此目标,以便在AttributeGroup
名称/值配对对象中生成Attribute
地图?
我通过EntityManager使用Hibernate。
答案 0 :(得分:0)
您不能将元素集合与另一个实体存储在同一个表中,因为名称/值对不能同时是元素和实体。元素没有标识,也不会保留任何其他字段。
您可能会做的是使用名称作为地图键的1:M或M:M属性。然后,您可以直接将具有名称/属性对的地图公开给应用程序,或创建其他访问者,以便在需要时将地图转换为地图。但由于身份,最好直接公开和使用属性。
如果不希望这样,那么可以通过元素集合使用String / String配对,但是您将无法将同一个表重用为实体或其他元素集合映射。该表将需要一个返回AttributeGroup的外键以及名称/值对的字段,如果重用这将导致问题。