【问题标题】:Map<String, String> with JPA使用 JPA 映射<String, String>
【发布时间】:2013-06-13 11:13:19
【问题描述】:

我有这样的 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 中实现这一点,以便在 AttributeGroup 中创建由 Attribute 名称/值配对对象制成的映射?

我正在通过 EntityManager 使用 Hibernate。

【问题讨论】:

  • 必须使用hibernate注解吗?我们不能进行 xml 映射吗?
  • 是的,我需要坚持使用 JPA 方法,hibernate 只是一个实现,因为我们将来可能会迁移到 OpenJPA。
  • 发布异常的完整堆栈跟踪,以及导致它的代码。另外,属性实体的意义何在?你好像没用过。您在方法中创建了一个新属性,但不对其进行任何操作。
  • 我用 AttributeGroup 表引用它:attribute.setAttributeGroup(this);
  • 是的,但是您的代码在那里什么也没做。 attribute 的实例已创建,您确实调用了 attribute.setAttributeGroup(this),但随后您什么也不做(例如,您不持久保存它),因此您所做的一切都会丢失。

标签: java hibernate jpa persistence


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2010-10-25
    • 2014-06-25
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2011-10-20
    • 1970-01-01
    • 2020-02-25
    相关资源
    最近更新 更多