使用JPA </string,>映射<string,string =“”>

时间:2013-06-13 11:13:19

标签: java hibernate jpa persistence

我有这样的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。

1 个答案:

答案 0 :(得分:0)

您不能将元素集合与另一个实体存储在同一个表中,因为名称/值对不能同时是元素和实体。元素没有标识,也不会保留任何其他字段。

您可能会做的是使用名称作为地图键的1:M或M:M属性。然后,您可以直接将具有名称/属性对的地图公开给应用程序,或创建其他访问者,以便在需要时将地图转换为地图。但由于身份,最好直接公开和使用属性。

如果不希望这样,那么可以通过元素集合使用String / String配对,但是您将无法将同一个表重用为实体或其他元素集合映射。该表将需要一个返回AttributeGroup的外键以及名称/值对的字段,如果重用这将导致问题。