具有SequenceGenerator和GeneratedValue的JPA
我有一个代码使用JPA注释来生成DB主键。DB序列用于使用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定序器返回的序列ID用作rec_id。 它是否正确?
DOC说:
序列策略序列策略由两部分组成 - 定义一个命名序列,并在一个或多个类的一个或多个字段中使用命名序列。 @SequenceGenerator注释用于定义一个序列并接受一个名称,一个初始值(默认值为1)和一个分配大小(默认值为50)。 序列对于应用程序是全局的,并且可以由一个或多个类中的一个或多个字段使用。 SEQUENCE策略用于@GeneratedValue注释,以将给定字段附加到先前定义的命名序列:
@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不会被使用。 因此,这种策略并不能保证序列值不会有间隙。
这将使用序列P_REC_ID_SEQUENCE
的下一个值。
这也取决于你正在使用的数据库。 您可以在Postgres
定义序列,但不能在MySQL
定义。
如果您使用的是MYSQL
那么您可以使用Auto-Incremement
但不需要定义序列。
如果您使用的是ORACLE
数据库,则将序列定义为
CREATE SEQUENCE emp_sequence
INCREMENT BY 1
START WITH 1
现在,如果当前的序列值是100,那么下一个将是101.我希望它是有道理的。
链接地址: http://www.djcxy.com/p/90891.html上一篇: JPA with SequenceGenerator and GeneratedValue
下一篇: How can a I create an field on my class thats autoIncremented from zero to 255