微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 Hibernate 映射集合 Map<String,List<String>> 类型

如何解决如何使用 Hibernate 映射集合 Map<String,List<String>> 类型

问题是使用 Hibernate 保留以下类。

Public class Album{
Private int albumid;
Private String aname;
Private Map<String,List<String>> photos;
}

我已经试过了

@Entity
public class Album {
    @Id
    private int albumId;
    @Column(name= "Album_Name")
    private String aname;
    
    @ElementCollection
    @MapKeyColumn(name= "Event_Name")
    @Column(name="Values")
    private Map<String,List<String>> photos;

但它显示诸如

之类的错误

    Exception in thread "main" org.hibernate.MappingException: Could not determine type for: java.util.List,at table: Album_photos,for columns: [org.hibernate.mapping.Column(Values)]
        at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:336)
        at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:310)
        at org.hibernate.mapping.Collection.validate(Collection.java:315)
        at org.hibernate.mapping.IndexedCollection.validate(IndexedCollection.java:89)
        at org.hibernate.cfg.Configuration.validate(Configuration.java:1362)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1849)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1928)
        at com.wipro.Insert.main(Insert.java:17)

解决方法

此映射不适用于 Hibernate ORM。

原因是您试图拥有两个嵌套的元素集合,而 Hibernate ORM 不支持此操作(第一个集合是 Map,第二个集合是 List)。

你必须使用实体。

您可以通过以下映射获得类似于 @ElementCollection 的内容:


@Entity
public static class PhotoEvent {
    @Id
    @Column(name = "Event_Name")
    public String eventName;

    @ElementCollection
    @Column(name = "`Values`")
    public List<String> values;

    @ManyToOne
    public Album album;
...
// getter/setter/hascode/equals...
}


@Entity
public static class Album {
    ...
    
    @OneToMany(mappedBy = "album",fetch = FetchType.EAGER,cascade = CascadeType.ALL,orphanRemoval = true)
    @MapKey(name = "eventName")
    public Map<String,PhotoEvent> photoEvents;
    
    ...
}

请注意,我设置 FetchType.EAGER 是因为它模拟 @ElementCollection,但您可能希望将其设置为 LAZY(默认值)。

您会找到有关此类映射 in the Hibernate ORM documentation 的更多详细信息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。