大家好,祝大家新年快乐。
我需要使用JPA在表的末尾插入一条记录(表没有设置自动增量)。
我知道我可以获得最后一个id(整数)并在插入之前应用于实体,但是如何才能完成?哪种方式最有效?
答案 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中声明这样的生成器。
我不知道他在表格方法中遇到了什么问题 - 我知道大型安装成功运行了这个问题。但无论如何,除了可伸缩性之外,这还取决于很多因素,例如,如果你想要它是可移植的等等。只需查找不同的策略并选择合适的策略。