我有一个使用JPA注释生成DB主键的代码。
@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注释中使用序列策略将给定字段附加到先前定义的命名序列:
@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。因此,这一策略并不能保证序列值不存在空白。
发布于 2018-07-06 14:49:10
将生成类型用作主键列上的自动序列。
@GeneratedValue(strategy = GenerationType.AUTO, generator = "generator")
@SequenceGenerator(name="generator", sequenceName="DB_SEQ_NAME")发布于 2013-12-10 09:20:40
这将使用序列P_REC_ID_SEQUENCE的下一个值。
这也取决于您正在使用的数据库。您可以在Postgres中定义序列,但不能定义MySQL。
如果您使用的是MYSQL,那么您可以使用Auto-Incremement,但是不需要定义序列。
如果使用的是ORACLE数据库,则将序列定义为
CREATE SEQUENCE emp_sequence
INCREMENT BY 1
START WITH 1现在,如果当前序列值是100,那么下一个序列值将是101。我希望这是合理的。
https://stackoverflow.com/questions/20490389
复制相似问题