首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有SequenceGenerator和GeneratedValue的JPA

带有SequenceGenerator和GeneratedValue的JPA
EN

Stack Overflow用户
提问于 2013-12-10 09:19:33
回答 2查看 20.5K关注 0票数 3

我有一个使用JPA注释生成DB主键的代码。

代码语言:javascript
复制
@Id
@Column(name = "rec_id", scale = 0)
@GeneratedValue(generator = "RecIdSequence", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "RecIdSequence", sequenceName = "P_REC_ID_SEQUENCE")
public Long getRecordId() {
    return outboundPackageRecordId;
}

现在,我对此的理解是: DB排序器返回的序列id用作rec_id。这是对的吗?

医生说:

序列策略序列策略由两部分组成:定义命名序列和在一个或多个类中的一个或多个字段中使用命名序列。@SequenceGenerator注释用于定义序列并接受名称、初始值(默认值为1)和分配大小(默认值为50)。序列对应用程序是全局的,可以由一个或多个类中的一个或多个字段使用。在@GeneratedValue注释中使用序列策略将给定字段附加到先前定义的命名序列:

代码语言:javascript
复制
@Entity
@SequenceGenerator(name="seq", initialValue=1, allocationSize=100) // Define a sequence - might also be in another class:
public class EntityWithSequenceId {
    // Use the sequence that is defined above:
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")
    @Id long id;
}

与自动和标识不同,序列策略在新的实体对象持久化(即提交之前)时立即生成一个自动值。当前面需要主键值时,这可能很有用。为了尽量减少到数据库服务器的往返行程,in是分组分配的。每个分配中的ID数由allocationSize属性指定。可能不会使用给定分配中的某些It。因此,这一策略并不能保证序列值不存在空白。

EN

回答 2

Stack Overflow用户

发布于 2018-07-06 14:49:10

将生成类型用作主键列上的自动序列。

代码语言:javascript
复制
@GeneratedValue(strategy = GenerationType.AUTO, generator = "generator")
@SequenceGenerator(name="generator", sequenceName="DB_SEQ_NAME")
票数 2
EN

Stack Overflow用户

发布于 2013-12-10 09:20:40

这将使用序列P_REC_ID_SEQUENCE的下一个值。

这也取决于您正在使用的数据库。您可以在Postgres中定义序列,但不能定义MySQL

如果您使用的是MYSQL,那么您可以使用Auto-Incremement,但是不需要定义序列。

如果使用的是ORACLE数据库,则将序列定义为

代码语言:javascript
复制
CREATE SEQUENCE emp_sequence
      INCREMENT BY 1
      START WITH 1

现在,如果当前序列值是100,那么下一个序列值将是101。我希望这是合理的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20490389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档