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

问题描述 投票:0回答:2

问题是使用 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)

java hibernate-mapping hibernate-annotations
2个回答
2
投票

此映射在 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
(默认值)。

您将在 Hibernate ORM 文档中找到有关此类映射的更多详细信息


0
投票

警告:HHH90000026:MySQL55Dialect 已被弃用;使用 org.hibernate.dialect.MySQLDialect 代替 org.hibernate.AnnotationException:使用 @OneToMany 或 @ManyToMany 定位未映射的类:com.chatGpt.assignment7.Album.photoEvents[com.chatGpt.assignment7.PhotoEvent] java.lang.NullPointerException:无法调用“org.hibernate.SessionFactory.openSession()”,因为“com.chatGpt.assignment7.HibernateUtil7.getSessionFactory()”的返回值为null 在 com.chatGpt.assignment7.AlbumDao.savePicture(AlbumDao.java:9) 在 com.chatGpt.assignment7.Main.main(Main.java:40)

© www.soinside.com 2019 - 2024. All rights reserved.