Hibernate中的排序映射键持久性

时间:2012-10-10 13:26:17

标签: java hibernate jpa map key

我希望有人可以帮我解决我的休眠问题,因为我一直在敲打谷歌大约一个小时没有结果。

所以问题是我在类中有一个SortedMap,使用Integer作为Key(及其自然的内置compareTo方法),另一个类作为值类型。我正在使用密钥来保持值类型的用户定义顺序,并尝试让Hibernate持久保存。

无论出于何种原因,Hibernate默认忽略我输入的密钥,而是使用值类型的主键作为密钥。当我将数据库加载回数据库时,我的所有键都以这种方式被更改。

地图的定义如下所示(我正在使用注释风格的Hibernate);

@ManyToMany(cascade = CascadeType.ALL)
@MapKey
@Sort(type = SortType.NATURAL)
private SortedMap<Integer, Column> columnOrder;

我不能使用Column类型来存储订单本身,因为Column可以在包含类型的许多实例中使用,每次都有不同的键值。任何指导都将非常感激。

2 个答案:

答案 0 :(得分:2)

所以我在发现这个类似问题的StackOverflow问题后找到了答案:Sorted map of Java primitives using JPA2 and Hibernate?

通过将@MapKey注释更改为@MapKeyColumn注释,我能够向Hibernate提供指令以将键保存在我指定的列名中,如下所示;

@ManyToMany(cascade = CascadeType.ALL)
@MapKeyColumn(name = "hierarchyOrdering")
@Sort(type = SortType.NATURAL)
private SortedMap<Integer, Column> columnOrder;

感谢您的帮助。

答案 1 :(得分:1)

来自javax.persistence.OrderColumn的javadoc:

  

指定用于维护列表的持久顺序的列。持久性提供程序负责在检索时和数据库中维护顺序。持久性提供程序负责在刷新到数据库时更新排序,以反映影响列表的任何插入,删除或重新排序。

因此可以使用一个列表。

JPA 2.0规范在2.2节持久字段和属性中说明:

  

必须根据以下某个集合定义集合值持久字段和属性 -   值接口,无论实体类是否遵守JavaBeans   上面提到的方法约定以及是否使用了字段或属性访问:java.util.Collection,   java.util.Set,java.util.List [3],java.util.Map。集合实现   应用程序可以使用type来在创建实体之前初始化字段或属性   执着。一旦实体被管理(或分离),后续访问必须通过   界面类型。

因此,似乎JPA不支持SortedMap