How to map a Map

后端 未结 1 1581
自闭症患者
自闭症患者 2021-02-02 02:47

I tried

@ManyToMany(cascade = CascadeType.ALL)
Map data = new HashMap();

but it produces the error

1条回答
  •  旧时难觅i
    2021-02-02 03:28

    Well, the error message is pretty clear: Double isn't an entity. If you want to map a collection of basic elements, use the CollectionOfElement annotation (from Hibernate) or the ElementCollection annotation (from JPA 2.0).

    So, assuming you're using Hibernate Annotations 3.4, try this:

    @CollectionOfElements(targetElement = Double.class)
    @org.hibernate.annotations.MapKey(targetElement = String.class)
    Map data;
    

    Or, when using generics:

    @CollectionOfElements
    Map data;
    

    And if you're using Hibernate Annotations 3.5+, prefer the JPA 2.0 annotations:

    @ElementCollection(targetClass = Double.class)
    @MapKeyClass(String.class)
    Map data;
    

    Or, when using generics:

    @ElementCollection
    Map data;
    

    References

    • Hibernate Annotations 3.4 Reference Guide
      • 2.4.6.2.2. Map
      • 2.4.6.2.5. Collection of element or composite elements
    • JPA 2.0 specification
      • Section 11.1.12 "ElementCollection Annotation"
      • Section 11.1.28 "MapKeyClass Annotation"

    Do you know how to customize the "ELEMENT" and "MAPKEY" column names ?

    You can fully customize the result. I think the sample below demonstrates everything:

    @CollectionOfElements(targetElement = Double.class)
    @JoinTable(name = "COLLECTION_TABLE", 
        joinColumns = @JoinColumn(name = "PARENT_ID"))
    @org.hibernate.annotations.MapKey(targetElement = String.class, 
        columns = @Column(name = "SOME_KEY"))
    @Column(name = "SOME_VALUE")
    private Map data;
    
    • The name of the collection table for the Map is defined using the JoinTable
      • The name of the column for the key to the parent is set using a JoinColumn in the JoinTable
    • The name of the column for the key of the map is defined in the MapKey
    • The name of the column for the value of the map is defined using the Column

    0 讨论(0)
提交回复
热议问题