【问题标题】:SortedMap Key Persistance in HibernateHibernate 中的 SortedMap 密钥持久性
【发布时间】:2012-09-30 23:47:21
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 与您的问题没有直接关系,但我想知道您为什么不只使用Column 的列表?我们有一个类似的用例,最后用一个列表做得更好。
  • 我可能弄错了,但是用户在任何时候都可以更改顺序,并且使用列表,我认为 hibernate 不会坚持排序的更改。 SortedMap 通过其内部实现确保正确排序。
  • 我只是不想在我们的用例中维护排序映射中的键的任务成为一场噩梦。如果您从一系列连续的键 1..n 开始并只进行一次更改(切换、添加、删除),则您必须在自己的代码中触摸该映射中的 O(n) 元素。如果您使用的是列表,则列表会处理它。

标签: java hibernate jpa map key


【解决方案1】:

所以我在发现这个 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;

感谢您的帮助。

【讨论】:

    【解决方案2】:

    来自javax.persistence.OrderColumn的javadoc:

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

    因此可以使用列表。

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

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

    所以 JPA 似乎不支持 SortedMap

    【讨论】:

    • SortedMap 是一个地图。此外,使用 List + @OrderColumn 仅在顺序连续的情况下才有效。如果是这样,你是对的,这是一个很棒的组合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 2017-08-18
    • 1970-01-01
    • 2014-09-08
    • 2012-12-19
    • 1970-01-01
    • 2017-12-26
    相关资源
    最近更新 更多