【发布时间】:2012-01-25 08:23:28
【问题描述】:
我用 Hibernate 制作了一个示例应用程序。我的要求是表上没有主键。我只需要从应用程序中选择查询。我知道应该有一个主键,但我所指的表是没有它的。
它有大约 50k 条记录。因此,修改表以添加 ID 列没有看到可行的选项。
可以吗?
【问题讨论】:
标签: hibernate
我用 Hibernate 制作了一个示例应用程序。我的要求是表上没有主键。我只需要从应用程序中选择查询。我知道应该有一个主键,但我所指的表是没有它的。
它有大约 50k 条记录。因此,修改表以添加 ID 列没有看到可行的选项。
可以吗?
【问题讨论】:
标签: hibernate
我的建议:在表中添加一个自增整数 PK 列。你会惊讶于它的速度。
【讨论】:
因此,修改表以添加 ID 列并没有看到可行的选项。
这是为什么呢?你的意思是,因为它已经有五万条记录了吗?相信我,这真的不是很多。
即使表没有代理键,也没有主键约束,即使你不愿意改变表,它仍然可能有某种candidate key —也就是说,一组永远不会为空的列,其值唯一地标识一条记录。即使不改变表来强制它们的唯一性和非空性,你也可以告诉 Hibernate 这些列形成了一个composite ID。
【讨论】:
我找到了没有主键和 null 作为值的表的解决方案。它将在 oracle DB 上运行。也许其他数据库也存在类似的情况。
您应该在 POJO 类中创建新的主键:
@Id @Column(name="id") 私有整数 id;
并像这样使用 createNativeQuery
getEntityManager().createNativeQuery("select rownum as id, .....
本机查询将生成主键,您将获得唯一的结果。
【讨论】:
不适用于休眠。 It requires a primary key.
【讨论】:
将 DB2 与没有主键的表一起使用,可以实现以下效果:
在Entity中定义主键字段类似于:
@Id
@Column(name="id")
private Integer id;
对于选择查询添加:
String selectQuery = "select ROW_NUMBER() OVER () id, ..."
我尚未测试实体的更新,但从数据库中选择信息可以正常工作
【讨论】: