【问题标题】:Hibernate without Primary Key没有主键的休眠
【发布时间】:2012-01-25 08:23:28
【问题描述】:

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

它有大约 50k 条记录。因此,修改表以添加 ID 列没有看到可行的选项。

可以吗?

【问题讨论】:

    标签: hibernate


    【解决方案1】:
    1. Hibernate requires that entity tables have primary keys. 故事结束。
    2. 当您谈论数据库时,50k 记录根本不算多。

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

    【讨论】:

    • awied 在这里Hibernate and no PK works 提到的答案根本没有触及您的数据库表。这是一个 Hibernate 不实际检查重复性的示例。
    • 所以故事并没有在第 1 点结束。有办法实现这一点。也请看:sourcedexter.com/…。我认为 ans 需要编辑!
    【解决方案2】:

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

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


    即使表没有代理键,也没有主键约束,即使你不愿意改变表,它仍然可能有某种candidate key —也就是说,一组永远不会为空的列,其值唯一地标识一条记录。即使不改变表来强制它们的唯一性和非空性,你也可以告诉 Hibernate 这些列形成了一个composite ID

    【讨论】:

    • 这是一个很好的答案,但要备份 OP,在很多情况下无法更改表并“使其正确”。例如,客户为我们提供了一个创建的视图,该视图不包含 ID、主键,并且在许多情况下包含重复行。非常令人沮丧,但它确实发生了。
    • 旧线程,但我仍然在谷歌上找到它。所以值得一提的是,在企业环境中工作时,您无法证明向具有巨大吞吐量和数百万行的表添加额外列是合理的,因为您无法使用您选择的 orm 框架查询它……您只需要解决它。
    【解决方案3】:

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

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

      @Id @Column(name="id") 私有整数 id;

    并像这样使用 createNativeQuery

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

    本机查询将生成主键,您将获得唯一的结果。

    【讨论】:

      【解决方案4】:

      不适用于休眠。 It requires a primary key.

      【讨论】:

        【解决方案5】:

        将 DB2 与没有主键的表一起使用,可以实现以下效果:

        在Entity中定义主键字段类似于:

        @Id
        @Column(name="id")
        private Integer id;
        

        对于选择查询添加:

        String selectQuery = "select ROW_NUMBER() OVER () id, ..."
        

        我尚未测试实体的更新,但从数据库中选择信息可以正常工作

        【讨论】:

          猜你喜欢
          • 2018-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-09
          • 1970-01-01
          • 2012-03-21
          • 2012-03-15
          • 1970-01-01
          相关资源
          最近更新 更多