java - 如何创建 Java(6) Hibernate(3.6) 实体或其他构造来创建 string + int 的唯一组合

标签 java hibernate jpa annotations sequence

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

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

所以我考虑过在 hibernate 中嵌入复合键等,但我真正想要的是拥有这个“额外”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 映射,然后将 extraId + magicString 放在 magicString 唯一的另一个表中。但是,我希望 hibernate 允许随心所欲地创建新的 magicString(应用程序要求),最好是表中的每一行一个,然后让 hibernate 通过增量/其他策略更新与该 magicString 关联的 extraId。

仔细阅读所有的 hibernate 手册并在单独的环境中自己尝试一些测试并没有完全达到我想要的效果(基本上动态创建命名和顺序 id),所以我希望得到 SO 的输入。完全有可能我必须自己在数据库中使用序列手动编码所有内容,或者拆分很长的内容并在上部和下部执行逻辑,但我真的不想这样做,因为有一天我可能必须维护此代码(确实有可能)。

编辑/附录

作为解决这个问题的一种偷偷摸摸的方法,我只是将 extraId 添加到 Foo 对象(放弃 extraKey 类),并从另一个对象单例生成它,在加载时,执行一个 group by 选择支持 Foo 表,返回 magicKey 和 max(extraId)。当我创建一个新的 Foo 时,我要求该对象(多线程安全)将给定 magicKey 的下一个 extraId 交给我,并将其推送到 Foo 中并存储它,从而在下次应用程序重新加载时更新每个 magicKey 的有效 extraId,而无需额外的 table 。在第一次请求新的 extraId 时,它会花费我一组查询的时间,这不是最理想的,但它对于我的需要来说足够快,足够简单以便将来维护,并且全部包含在外部类中,所以我可以替换它如果我想出更聪明的东西,就在一个地方。我确实不喜欢在我的 dao 中为此目的添加额外的“特殊查询”,但将来很容易删除它,并且有详细的文档记录。

最佳答案

也许我还是没有正确理解你的问题,但我认为你可以考虑使用Hibernate的hilo算法。它将根据 Hibernate 创建和管理的表生成整个数据库的唯一标识符。更多详细信息请参见:

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

关于java - 如何创建 Java(6) Hibernate(3.6) 实体或其他构造来创建 string + int 的唯一组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5253658/

相关文章:

java - Eclipse 插件中的源代码编辑器

java - 在Java中,Spring无需任何脚本即可维护数据库

java - 在 WHERE 子句中使用多对多集(连接表)进行查询

java - Hibernate 5 :- org. hibernate.MappingException: 未知实体

java - Postgresql JPA Hibernate 创建数据库

java - 在 Maven 中指定 Java 版本 - 属性和编译器插件之间的差异

java - 对泛型类型 SparseArray<E> 的引用应该参数化

java - 如何列出 jComboBox 值

mysql - 如何在 MySQL 中为 case 语句编写 Criteria Builder

hibernate - ReferencedColumnNames 未映射到单个属性