如何使用Hibernate映射LinkedHashMap?
我想用Hibernate(注释驱动)映射LinkedHashMap 我知道属性@MapKey和@IndexColumn,但是我可以用它们来映射带有基本字符串的linkedhashmap吗 请不要给出一个解决方案,我必须将宠物外部化到一个类中,并使用宠物列表而不是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
@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
在内部工作,我不认为按整数“键入”映射应该比索引到简单列表更有利。。。