当前位置: 首页 > 知识库问答 >
问题:

带有SequenceGenerator和GeneratedValue的JPA

匡安宜
2023-03-14

我有一个使用JPA注释生成数据库主键的代码。一个数据库序列用于使用Oracle DB生成PK.Am

@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 sequencer返回的sequence id作为rec_id。这是正确的吗?

医生说:

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

@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;
}

与AUTO和IDENTITY不同,SEQUENCE策略在新实体对象持久化后(即在提交之前)立即生成一个自动值。当更早需要主键值时,这可能很有用。为了最大限度地减少到数据库服务器的往返,ID被分组分配。每个分配中的ID数量由allocationSize属性指定。给定分配中的一些ID可能不会被使用。因此,此策略不保证序列值不会有空白。

共有2个答案

南门飞
2023-03-14

这将使用序列< code>P_REC_ID_SEQUENCE中的下一个值。

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

如果您使用的是MYSQL,那么您可以使用自动增量,但您不需要定义序列。

如果您使用的是< code>ORACLE数据库,您可以将序列定义为

CREATE SEQUENCE emp_sequence
      INCREMENT BY 1
      START WITH 1

现在,如果当前序列值是100,那么下一个将是101。希望有意义。

南宫勇军
2023-03-14

在主键列上将生成类型用作AUTO instead SEQUENCE。

@GeneratedValue(strategy = GenerationType.AUTO, generator = "generator")
@SequenceGenerator(name="generator", sequenceName="DB_SEQ_NAME")
 类似资料:
  • 问题内容: 问题概述 在看似随机的时间,我们会收到一个异常“ PostgreSQL重复键违反了唯一约束”。我确实认为我知道我们的问题是什么,但是我不想在没有可重现的测试用例的情况下对代码进行更改。但是由于除了随机生产之外,我们无法在任何环境中复制它,因此我要求SO的帮助。 在这个项目中,我们有多个postgres数据库,并且为每个数据库中的每个表配置了主键序列。这些序列是这样创建的: 我们使用以下

  • 问题内容: 我正在Oracle DB中插入一些记录。为了唯一,我正在使用SequenceGenerator。下面是代码: XxspPoInLineLocqty与XxspPoInLine具有@ManyToOne关系。当我坚持XxspPoInLine实体时,我收到以下错误: 我查看了stackoverflow,并为此找到了一些解决方案: 1.使用allocationSize = 1 因为我有5000+

  • 我使用带有PostgreSQL的JPA OpenJPA作为后端RDBMS。我的表的主键通常由/列组成。因此PostgreSQL自动为新条目生成ID()。 ID属性的注释如下所示: 我的问题是:我可以复制并粘贴这个注释块到几个实体上,同时只修改值吗?每个表的不同。但是,所有实体的SequenceGenerator可以被命名为或类似的名称吗?还是必须为每个实体的SequenceGenerator指定唯

  • 问题内容: 我们都知道使用Hibernate时的默认行为-它使实际数据库序列增加 一 ,将该值乘以50(默认值)-然后将该值用作实体ID。 这是错误的行为,并与说明以下内容的规范冲突: distributionSize-(可选)从序列中分配序列号时要增加的数量。 需要明确的是:我不关心生成的ID之间的差距。 我关心与基础数据库序列 不一致的 ID 。例如:任何其他应用程序(例如,使用纯JDBC)可

  • 何时才能可靠地知道设置了新创建实体的字段,该字段带有注释? JPA规范对此并不是很具体。我见过类似的问题,但他们得到的答案却不一样,令人困惑。我知道一旦事务被提交,id就已经设置好了,但是如果事务还在运行,而我需要id怎么办呢? 我怎样才能可靠地得到它?

  • 问题内容: 我有一个具有以下结构的MySQL数据库(节选): 另外,还有一个USER表,但这并不重要,有了这些表,您可以了解问题的全貌。 如您所见,某些列具有将在类中变为的属性。 并且由于它们与其他表的关系而具有复合主键,因此我无法更改。由于为Composite ,因此映射的类必须具有一个带有相应类的。 问题是我需要在组合的 “本机” 部分中添加一个,例如:必须具有JPA @GeneratedVa