如何使用Hibernate映射LinkedHashMap?

时间:2011-07-07 08:45:23

标签: hibernate mapping hibernate-mapping

我想用Hibernate(注释驱动)映射LinkedHashMap。

我知道属性@MapKey和@IndexColumn,但是我可以用两者来映射带有基本字符串的linkedhashmap吗?

请不要给出一个解决方案,我必须将宠物外化到一个类并使用Pet列表而不是LinkedHashMap(我知道如何做到但我显然不想这样做)。

我的班级:

@Entity
public class Person
{
    private LinkedHashMap<String, String> pets;

    // map definition ?
    // id of the pet > name of the pet
    public LinkedHashMap<String, String> getPets()
    {
        return pets;
    }

    ...
}

3 个答案:

答案 0 :(得分:3)

您可以使用@Lob注释:LinkedHashMap将被序列化并存储在BLOB列中(并在从数据库中读取时反序列化)。

但这当然是脆弱的,不可能查询,强迫使用Java来阅读宠物的内容。

如果您需要更传统的映射到具有一对多关联的其他Pet表,那么您将需要一个Pet实体。

答案 1 :(得分:2)

因为我正在尝试学习Hibernate(版本3)

,所以只是因为这个问题

我做过类似这样的事情来对数据库进行排序: 你不能将LinkedHasMap直接映射到Hibernate,因为它不是一个集合,它是一个集合的实现。

您可以这样做:

@ElementCollection
@JoinTable(name = "PERSON_PET", joinColumns = @JoinColumn(name = "PERSON_ID"))
@MapKeyColumn(name = "PET_KEY")
@Column(name = "PET_NAME")
@OrderBy(clause = "lower(PET_NAME) asc")
private Map<String, String> pets = new LinkedHashMap<String, String>();

来自Java Persistence with Hibernate

  

您可以按集合表的任何列进行排序。在内部,Hibernate使用了   LinkedHashMap,一种保留关键元素插入顺序的地图变体。   换句话说,Hibernate用于添加元素的顺序   在加载集合期间,集合是您在自己的集合中看到的迭代顺序   应用。同样可以用一套:Hibernate内部使用一个   LinkedHashSet。在Java类中,属性是常规的Set / HashSet,但是   Hibernate的内部包装与LinkedHashSet再次启用了   order-by属性

答案 2 :(得分:1)

您可以使用@ElementCollection注释来映射基本类型的地图。应该看起来像

    @ElementCollection(fetch=FetchType.EAGER)
    @CollectionTable(name = "person_pets", joinColumns = @JoinColumn(name = "person_id"))
    @MapKeyColumn(name = "name")
    @OrderColumn(name = "name")
    @Column(name = "pet")
    private Map<String, String> pets = new LinkedHashMap<String, String>();