如何使用Hibernate映射LinkedHashMap?

如何使用Hibernate映射LinkedHashMap?,hibernate,mapping,hibernate-mapping,Hibernate,Mapping,Hibernate Mapping,我想用Hibernate(注释驱动)映射LinkedHashMap 我知道属性@MapKey和@IndexColumn,但是我可以用它们来映射带有基本字符串的linkedhashmap吗 请不要给出一个解决方案,我必须将宠物外部化到一个类中,并使用宠物列表而不是LinkedHashMap(我知道怎么做,但我显然不想这样做) 我的班级: @Entity public class Person { private LinkedHashMap<String, String> pet

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

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

请不要给出一个解决方案,我必须将宠物外部化到一个类中,并使用宠物列表而不是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;
    }

    ...
}
@实体
公共阶层人士
{
私人LinkedHashMap宠物;
//地图定义?
//宠物id>宠物名称
公共LinkedHashMap getPets()
{
归还宠物;
}
...
}

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

但这当然是脆弱的,无法查询,迫使使用Java读取宠物的内容


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

您可以使用
@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>(); 
@ElementCollection(fetch=FetchType.EAGER)
@CollectionTable(name=“person\u pets”,joinColumns=@JoinColumn(name=“person\u id”))
@MapKeyColumn(name=“name”)
@OrderColumn(name=“name”)
@列(name=“pet”)
私有映射宠物=新LinkedHashMap();

我只是简单地提到了这一点,因为我正在尝试学习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>();
@ElementCollection
@JoinTable(name=“PERSON\u PET”,joinColumns=@JoinColumn(name=“PERSON\u ID”))
@MapKeyColumn(name=“PET_KEY”)
@列(name=“PET_name”)
@订购人(条款=“下级(宠物名称)asc”)
私有映射宠物=新LinkedHashMap();
引自

您可以按集合表的任何列排序。在内部,Hibernate使用 LinkedHashMap,保留关键元素插入顺序的映射的变体。 换句话说,Hibernate将元素添加到 集合,在集合加载期间,是您在应用程序中看到的迭代顺序 应用对集合也可以这样做:Hibernate在内部使用 LinkedHashSet。在Java类中,属性是一个常规集/哈希集,但是 Hibernate使用LinkedHashSet的内部包装再次通过启用 按属性排序


由于serialVersionUid更改java版本时是否存在一些问题?因为我不能仅仅通过更改java版本来释放数据。您可能希望将来的版本能够保持向后兼容,但是更改java实现肯定会破坏它。我不会指望的。你可能想使用一个自定义类型,将其序列化为XML或JSON,但我会选择一个映射到表的实体:更标准、更高效、更可查询、更易于维护。这不是一个好的解决方案,因为你只映射一个经典的hashmap,我想按顺序映射LinkedHashMap。你说得对。我们可以尝试@OrderColumn,但是我找不到任何证据表明此注释可用于Map。(更新了示例)至少,
@OrderColumn
需要一个整数类型:请参阅API文档:“订单列必须是整数类型。”即使它作为
LinkedHashMap
在内部工作,我不认为按整数“键入”映射应该比索引到简单列表更有利。。。