【问题标题】:I want to map a Map<Long, List<POJO>> through JPA我想通过 JPA 映射 Map<Long, List<POJO>>
【发布时间】:2013-02-10 16:41:22
【问题描述】:

我想在 @Entity 类中映射一个 Map&lt;Long, List&lt;ItemAttribute&gt;&gt;,其中 ItemAttribute 本身是一个单独定义的 @Entity

这是我用于映射的代码:

@Entity
@Table(name = "ITEM_ATTRIBUTE_GROUP")
public class ItemAttributeGroup implements Cloneable, Serializable
{
      @ElementCollection
      @MapKeyColumn(name="groupId")
      @JoinTable(name = "ATTRIBUTES_IN_GROUP", joinColumns = @JoinColumn(name = "groupId"),
                        inverseJoinColumns = @JoinColumn(name = "ID"))
      private Map<Long, List<ItemAttribute>> attributes = new HashMap<Long, List<ItemAttribute>>();
     //getters and setters........
}

ItemAttribute 是下面提到的一个单独的类:

@Entity
@Table(name = "ITEM_ATTRIBUTE")
public class ItemAttribute implements Cloneable, Serializable {
    private static final long serialVersionUID = -8017036630979138942L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID")
    private Long id;

    @ElementCollection // this is a collection of primitives
    @JoinTable(name="ATTRIBUTE_VALUE_RANGE", joinColumns=@JoinColumn(name="ID"))
    @MapKeyColumn (name="RANGE_ID")// column name for map "key"
    @Column(name="VALUE")//  column name for map "value"
    private Map<String, String> attributeValueRange = new HashMap<String, String>();

    @ElementCollection // this is a collection of primitives
    @JoinTable(name="QUALIFIER_VALUE_RANGE", joinColumns=@JoinColumn(name="ID"))
    @MapKeyColumn (name="RANGE_ID")// column name for map "key"
    @Column(name="VALUE")//  column name for map "value"
    private Map<String, String> qualifierValueRange = new HashMap<String, String>();

    public Map<String, String> getAttributeValueRange() {
        return attributeValueRange;
    }

    public void setAttributeValueRange(Map<String, String> attributeValueRange) {
        this.attributeValueRange = attributeValueRange;
    }

    public Map<String, String> getQualifierValueRange() {
        return qualifierValueRange;
    }

    public void setQualifierValueRange(Map<String, String> qualifierValueRange) {
        this.qualifierValueRange = qualifierValueRange;
    }
}

问题出在我无法识别的代码中。 我收到此错误

使用@JoinTable.inverseJoinColumns 定位未映射的类: ItemAttributeGroup.attributes[java.util.List]

【问题讨论】:

  • 对不起。我已经进行了编辑。我也应该使用 @Column 注释,但我无法确定在这种情况下我应该如何映射 Map 的 value 字段。

标签: java hibernate jpa annotations mapping


【解决方案1】:

你需要创建一个中间类ItemAttributes。

@Entity
public class ItemAttributes {

   @OneToMany
   private List<ItemAttribute> attributes;
}

@Entity
public class ItemAttributeGroup implements Cloneable, Serializable {

   @OneToMany
   private Map<Long, ItemAttributes> attributesMap;
}

【讨论】:

  • 不加这个中间类就不行吗?
  • 据我所知,增加一个中间类是唯一的办法
  • @overmeulen,我认为地图必须是@OneToMany?
  • @sharakan,我只是重用了问题中指定的注释,但你是对的。我编辑了我的帖子。
  • 但我也将@ElementCollection 与另一个 Map 一起使用。它工作正常。
猜你喜欢
  • 2013-05-08
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
  • 2014-06-25
相关资源
最近更新 更多