【问题标题】:How to insert a entity at the end of a table using JPA?如何使用 JPA 在表的末尾插入实体?
【发布时间】:2010-12-31 14:17:17
【问题描述】:

大家好,新年快乐。

我需要使用 JPA 在表的末尾插入一条记录(该表没有设置自动增量)。

我知道我可以获取最后一个 id(整数)并在插入之前应用到实体,但是怎么做呢?哪种方式最有效?

【问题讨论】:

    标签: java oracle hibernate jpa


    【解决方案1】:

    没有“桌子的尽头”之类的东西。关系表中的行没有排序

    只需插入新行。如果您需要任何特定顺序,则需要在从表中选择行时应用ORDER BY

    如果您正在谈论生成新 ID,请使用 Oracle 序列。它保证了唯一性。

    我不建议使用“柜台”。 该解决方案要么不可扩展(如果实现正确),要么不安全(如果可扩展)。

    这就是创建序列的目的。我不知道 JPA,但是如果您无法从序列中获取 ID,那么我建议您找到更好的 ORM。

    【讨论】:

    • 不是答案,但是,当我说“表的末尾”时,我的意思是在关系表中我知道的最后一个或最大 id 之前没有特定的顺序,可能我没有解释好
    • “之前”对于主键也没有意义。只需生成一个唯一编号。不要担心它相对于其他主键出现的“位置”。主节点的实际数量永远不应该有“意义”。这正是序列所提供的
    【解决方案2】:

    好吧,虽然我不知道表的末尾到底在哪里,但 JPA 有很多选项可以插入 ID 生成器。

    一个常见的选项是使用自己的表,为每个需要 ID 的实体设置一个计数器(来自 http://download.oracle.com/docs/cd/B32110_01/web.1013/b28221/cmp30cfg001.htm)。

    @Id(generate=TABLE, generator="ADDRESS_TABLE_GENERATOR")
    @TableGenerator(
    name="ADDRESS_TABLE_GENERATOR", 
        tableName="EMPLOYEE_GENERATOR_TABLE", 
        pkColumnValue="ADDRESS_SEQ"
    )
    @Column(name="ADDRESS_ID")
    public Integer getId() {
        return id;
     }
    

    ...要搜索的其他“生成器”策略...

    编辑

    我敢于引用@a_horse_with_no_name,因为他说他不了解 JPA。如果你想使用像序列这样的原生机制(不是每个 DB 都可用),你也可以在 JPA 中声明这样的生成器。

    我不知道他在使用 table 方法时遇到了什么问题 - 我知道大型安装成功运行此方法。但无论如何,这取决于除可扩展性之外的许多因素,例如,如果您希望它具有可移植性等。只需查找不同的策略并选择合适的。

    【讨论】:

    • 拥有计数器表在多用户环境中不能可靠地工作 - 除非您对表执行独占锁定。这反过来又使它在高插入率的环境中变慢。如果您每小时只插入几行,则可能不会有很大的性能损失。但是,如果您想每分钟插入数百次,那么锁定它 成为一个问题。顺便说一句:很多 DBMS 都支持序列,例如 Oracle、Firebird、PostgreSQL、DB2、H2、Derby、Ingres 和 Informix。本机解决方案总是比柜台更快、更可靠。
    • @a_horse_with_no_name - 更短的名字怎么样 :-) 如果你每次只检查一个数字,你是对的 - 但除非你有一些需要升序的特殊业务结构,否则不需要这样做,不间断,唯一编号。在引擎盖下,序列只不过是一个具有原子独占访问权限的单例表。我承认像 JPA 这样的层会增加这种结构的惩罚。但它仍然可以做一些优化。
    猜你喜欢
    • 2013-03-29
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多