Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建Java(6)Hibernate(3.6)实体或其他构造以创建字符串+int的唯一组合_Java_Hibernate_Jpa_Annotations_Sequence - Fatal编程技术网

如何创建Java(6)Hibernate(3.6)实体或其他构造以创建字符串+int的唯一组合

如何创建Java(6)Hibernate(3.6)实体或其他构造以创建字符串+int的唯一组合,java,hibernate,jpa,annotations,sequence,Java,Hibernate,Jpa,Annotations,Sequence,我正在用Java6开发一个桌面应用程序,使用H2作为db,Hibernate3.6 由于有一个包含JNI的第三方库的构造和一些事先做出的有趣的决定,我无法在它们的索引代码中传递长标识符,只能传递int。这些索引是快速生成的,可重复,这不是我的选择,而是通过回调传递的。但是,我可以沿着字符串值的行分割预期的数据集,并将我的id大小保持为int,而不会吹掉我的id。为此,我在核心对象上保留了一个长值作为pk,然后将其作为一对一的表使用到另一个表中,在该表中,它将int-id映射回核心实体,当与字符串

我正在用Java6开发一个桌面应用程序,使用H2作为db,Hibernate3.6

由于有一个包含JNI的第三方库的构造和一些事先做出的有趣的决定,我无法在它们的索引代码中传递长标识符,只能传递int。这些索引是快速生成的,可重复,这不是我的选择,而是通过回调传递的。但是,我可以沿着字符串值的行分割预期的数据集,并将我的id大小保持为int,而不会吹掉我的id。为此,我在核心对象上保留了一个长值作为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允许按whimapp要求创建新的magicString,最好是表中每行一个,然后让hibernate通过增量/其他策略更新与该magicString关联的extraId

仔细阅读所有的hibernate手册,并在单独的环境中独自尝试一些测试,并没有完全产生我想要的动态创建的命名和顺序id,所以我希望so的输入。这完全有可能,我将不得不亲自在db中用序列编写所有代码,或者拆分一个长代码,并在上下两层执行逻辑,但我真的不愿意,因为我可能有一天会维护这些代码

编辑/补遗


为了避免这种情况,我只是偷偷地将extraId添加到Foo对象中,丢弃extraKey类,并从另一个对象单例生成它,在加载时,通过在backing Foo表上进行选择,返回magicKey和maxextraId来进行分组。当我创建一个新的Foo时,我要求objectmulti-thread-safe将给定magicKey的下一个extraId交给我,并将其推送到Foo中存储,从而在下次应用程序重新加载时更新每个magicKey的有效extraId,而不需要额外的表。在第一次请求一个新的extraId时,我需要一组查询,这是次优的,但它足够快,可以满足我的需要,足够简单,可以在将来维护,并且都包含在一个外部类中,因此如果我能想出更聪明的方法,我可以在一个地方替换它。我不喜欢在我的DAO中为这个目的提供额外的特殊查询,但是它很容易在将来删除,而且记录得很好。

< P>也许我还没有正确地理解你的问题,但是我认为你可以考虑使用Hibernate的HILO算法。它将根据Hibernate创建和管理的表为整个数据库生成唯一标识符。详情如下:


你对magicString的大小有限制吗?目前在我的潜在数据流中,最长的一个不经常更改的是88个字符。实际上,我需要支持多达255个。那么,为什么不使用java的UUID工具呢?好了,没有办法从UUID获得保证唯一的int值。只要是一般原则,它就使用long。当然,我可以从magicString字段的字节中创建一个UUID,但是我有一个UUID字段,其中最小和最大的有效值都是long,它们本身都不能保证唯一。我不认为如果我逻辑移位并为命名变量窃取一个整数大小的值块。我是不是错过了什么?我不明白。。。您希望一个神奇的字符串在所有记录中都是唯一的,并将其链接到额外的id,其中额外的id是一个可能是增量的整数。这个神奇的字符串可能是UUID,但似乎您不想要,因为您无法从中提取int?如果是这样,我真的不明白魔术弦的作用是什么。至于额外的id,您是否考虑过使用Hibernate的一种生成策略,比如hilo?通过这种方式,每个桌面客户端可以根据分配给它的范围生成自己的顺序值。必须进行实验。看起来select参数可以实现我想要的功能,但文档中的内容并不具体。