0

我有这样的 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' 值作为值。

目前的方法对我不起作用。当我尝试将记录持久保存到数据库时,它会生成事务仅标记为回滚的异常。我不知道它是否甚至是执行此操作的写入方式,如果它显然不起作用,那么它不是。

我怎样才能在 JPA 中实现这一点,以便AttributeGroupAttribute名称/值配对对象中制作地图?

我正在通过 EntityManager 使用 Hibernate。

4

1 回答 1

0

您不能将元素集合与另一个实体存储在同一个表中,因为名称/值对不能既是元素又是实体。元素没有身份,也不会维护任何其他字段。

您可能会做的是使用名称作为映射键的 1:M 或 M:M to Attribute。然后,您可以将带有名称/属性对的地图直接公开给应用程序,或者在需要时创建将地图转换为地图的附加访问器。但是,由于身份,直接公开和使用属性可能是一个更好的主意。

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

于 2013-06-13T13:13:40.247 回答