如何使用JPA在表的末尾插入实体?

时间:2010-12-31 14:17:17

标签: java oracle hibernate jpa

大家好,祝大家新年快乐。

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

我知道我可以获得最后一个id(整数)并在插入之前应用于实体,但是如何才能完成?哪种方式最有效?

2 个答案:

答案 0 :(得分:3)

没有“桌子的结尾”这样的东西。关系表中的行未排序

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

如果您正在讨论生成新ID,请使用Oracle序列。它保证了独特性。

我不建议使用“计数器表”。 该解决方案要么不可扩展(如果它正确实现),要么不安全(如果它是可扩展的)。

这就是创建序列的原因。我不知道JPA,但如果你不能从序列中获取ID,那么我建议你找一个更好的ORM。

答案 1 :(得分: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;
 }

......其他“发电机”策略用Google搜索......

修改

我敢提及@a_horse_with_no_name,因为他说他不了解JPA。如果你想使用序列之类的本机机制(在每个数据库中都不可用),你也可以在JPA中声明这样的生成器。

我不知道他在表格方法中遇到了什么问题 - 我知道大型安装成功运行了这个问题。但无论如何,除了可伸缩性之外,这还取决于很多因素,例如,如果你想要它是可移植的等等。只需查找不同的策略并选择合适的策略。