我想用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;
}
...
}
答案 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>();