【发布时间】:2010-12-31 14:17:17
【问题描述】:
大家好,新年快乐。
我需要使用 JPA 在表的末尾插入一条记录(该表没有设置自动增量)。
我知道我可以获取最后一个 id(整数)并在插入之前应用到实体,但是怎么做呢?哪种方式最有效?
【问题讨论】:
大家好,新年快乐。
我需要使用 JPA 在表的末尾插入一条记录(该表没有设置自动增量)。
我知道我可以获取最后一个 id(整数)并在插入之前应用到实体,但是怎么做呢?哪种方式最有效?
【问题讨论】:
没有“桌子的尽头”之类的东西。关系表中的行没有排序。
只需插入新行。如果您需要任何特定顺序,则需要在从表中选择行时应用ORDER BY。
如果您正在谈论生成新 ID,请使用 Oracle 序列。它保证了唯一性。
我不建议使用“柜台”。 该解决方案要么不可扩展(如果实现正确),要么不安全(如果可扩展)。
这就是创建序列的目的。我不知道 JPA,但是如果您无法从序列中获取 ID,那么我建议您找到更好的 ORM。
【讨论】:
好吧,虽然我不知道表的末尾到底在哪里,但 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 方法时遇到了什么问题 - 我知道大型安装成功运行此方法。但无论如何,这取决于除可扩展性之外的许多因素,例如,如果您希望它具有可移植性等。只需查找不同的策略并选择合适的。
【讨论】: