2011-12-21 121 views
9

我用Hibernate做了一个示例应用程序。我的要求是桌子上没有主键。我只需要从应用程序中选择查询。我知道应该有一个主键,但我所指的桌子却没有它。没有主键休眠

它有大约50K记录。所以,修改表格以添加ID列没有看到可行的选项。

它有可能吗?

回答

22
  1. Hibernate requires that entity tables have primary keys.故事结束。
  2. 当你谈论数据库时,50k记录根本就不是那么多。

我的建议:在表中添加一个自动增量整数PK列。你会对它的速度感到惊讶。

+3

在没有触及你的数据库表的情况下,在这里提到的答案[Hibernate和没有PK作品](http://stackoverflow.com/questions/767277/hibernate-and-no-pk)。这是Hibernate实际上不检查重复的一个例子。 – Sankalp 2014-02-05 12:45:28

8

因此,修改表中添加ID列没有看到可行的选项。

这是为什么?你的意思是,因为它已经有五万条记录?相信我,那真的不是很多。


即使表不具有代理键,并没有一个主键约束,即使你不愿意修改表,但仍可能有某种candidate key —也就是说,一些永远不为空的列集合,其值唯一标识一条记录。即使不修改表来强制其唯一性和非无效性,您可以告诉Hibernate这些列形成composite ID

+3

这是一个很好的答案,但要备份操作系统,有很多情况下,无法更改表格并“正确”。例如,客户向我们提供了一个创建的视图,该视图不包含ID,不包含主键,在许多情况下还包含重复的行。非常沮丧,但它发生。 – cbmeeks 2013-04-18 20:04:24

+1

旧的线程,但即时通讯仍然在谷歌上找到它。值得一提的是,在企业环境中工作时,由于您不能用您选择的orm框架查询它,您无法证明向具有巨大吞吐量和数百万行的表添加额外列是合理的......您只需要解决它。 – cowls 2014-04-03 08:15:26

0

我找到了没有主键和空值为表的解决方案。它将在oracle数据库上运行。也许其他数据库存在类似的情况。

  1. 您应该创建在POJO类新的主键:

    @Id @Column(name = “ID”) 私人整数ID;

,并使用createNativeQuery这样

getEntityManager().createNativeQuery("select rownum as id, ..... 

本机查询将生成主键,你会得到独特的效果。