我正在使用H2作为数据库和Hibernate 3.6在Java6中开发桌面应用程序。

由于具有涉及JNI的第三方库的构造以及先验地做出了一些有趣的决定,因此我无法在其索引代码中传递长标识符,而只能传递int。这些索引是快速重复生成的(不是我的选择),并通过回调传递。但是,我可以沿着字符串值的行分割期望的数据集,并将id的大小保持为int,而不会破坏id。为此,我在核心对象上保留一个长值为pk的值,然后将其作为一对一使用到另一个表中,在该表中它将int id映射回核心实体,并与字符串,是唯一的。

因此,我在休眠状态下考虑了嵌入式复合键等,但是我真正想要的是仅具有此“额外” ID,该ID在额外的字符串键的上下文中是唯一的,但不一定是通用的。

所以像(不添加多余的代码/注释):

@Entity
public class Foo{
  ...
  @Id
  public Long getId(){...}
  ...
  @OneToOne
  @PrimaryKeyJoinColumn
  public ExtraKey getExtra(){...}
}

@Entity
public class ExtraKey{
  ...
  @Id
  public Long getFooId(){...}
  ...
  public Integer getExtraId(){...}
  ...
  public String getMagicString(){...}
}


在那种情况下,我什至可以删除magicString,仅在表中具有fooId-> extraId映射,然后在另一个具有magicString唯一性的位置中具有extraId + magicString。但是,我希望休眠状态允许按需求(应用要求)创建新的magicString,理想情况下在表中每行创建一个,然后让休眠状态仅通过增量/其他策略更新与该magicString相关联的extraId。

仔细阅读所有休眠手册并在单独的环境中尝试一些测试并不能完全满足我的要求(基本上是动态创建的具名和顺序ID),所以我希望能得到SO的输入。我完全有可能必须自己在数据库中使用序列手动编码所有内容,或者在上层和下层拆分一个长整数并执行逻辑,但是我宁愿不这样做,因为有一天我可能必须维护此代码(确实有可能)。

编辑/附录

作为解决此问题的一种偷偷摸摸的方法,我只是将extraId添加到Foo对象(放弃extraKey类),然后从另一个对象单例生成它,在加载时通​​过在支持的Foo表上进行选择来进行分组,返回magicKey和max(extraId)。当我创建一个新的Foo时,我要求该对象(多线程安全)将给定magicKey的下一个extraId递给我,并将其推送到Foo中,并将其存储,从而在下一个应用程序重新加载时为每个magicKey更新我的有效extraId,而无需额外花费表。在第一次请求一个新的ExtraId时,它花了我一个查询小组,这是次优的,但是它满足我的需求足够快,将来可以轻松维护,并且都包含在外部类中,因此我可以替换它如果我想出一个更聪明的东西,那就在一个地方。我确实不喜欢在此dao中添加额外的“特殊查询”,但是将来很容易删除它,并且有据可查。

最佳答案

也许我仍然不太了解您的问题,但是我认为您可以考虑使用Hibernate的hilo算法。它会基于Hibernate创建和管理的表为整个数据库生成唯一的标识符。此处有更多详细信息:

http://docs.jboss.org/hibernate/core/3.5/reference/en/html/mapping.html#mapping-declaration-id

09-04 04:19