3

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

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

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

Map 的定义如下所示(我使用的是注解式 Hibernate);

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

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

4

2 回答 2

2

所以我在发现这个 StackOverflow 问题后找到了答案:使用 JPA2 和 Hibernate 的 Java 原语的排序映射?

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

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

谢谢您的帮助。

于 2012-10-10T14:28:37.570 回答
1

来自的javadoc javax.persistence.OrderColumn

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

因此,可以为此使用列表。

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

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

所以似乎SortedMapJPA 不支持 a 。

于 2012-10-10T13:56:39.383 回答