How to provide Initial value OR Increment ID with JPA GenerationType.AUTO
我正在使用以下代码定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
对于我的应用程序启动后的第一个
我的问题是,如果有人在执行
我的主要问题是我现在无法创建
我尝试了
将
如果有人可以在
由于
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
标识列将在提交事务后立即自动分配一个值。您不要为标识列设置任何值,因为它是数据库分配值的工作。因此,您也无需考虑任何初始值(对于标识列完全忽略它们)
在此处提供的答案中以及在stackoverflow和其他论坛上的类似问题中,我尝试了各种选择,
我没有什么限制,
使用以下更改已解决:
通过
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @Entity @Table(name ="MY_TABLE") public class MyEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO, generator="seq") @GenericGenerator(name ="seq", strategy="increment") @Column(name ="MY_TABLE_ID") private Integer myTableId; @Column(name ="MY_TABLE_NM") private String myTableName; //Getters Setters } |
它帮助了我,因为,
来自Hiberbate DOC
increment
An IdentifierGenerator that returns a long, constructed by counting
from the maximum primary key value at startup. Not safe for use in a
cluster!
因为,即使手动插入它,它也会增加已经存在的
如果需要更多控制,也可以实现自己的生成器。
请参见此接口IdentifierGenerator。
因此,您可以获取记录计数,例如通过@NamedQuery。
然后,您可以自己生成一个标识符。
1 2 3 4 5 6 7 8 | public class MyEntityKeyGenerator implements IdentifierGenerator { @Override public Serializable generate(SessionImplementor session, Object object) { // SELECT count(ent) from MyEntity ent; Long count = (Long) session.getNamedQuery("count-query").uniqueResult(); // calc and return id value } } |
实体:
1 2 3 4 5 6 | class MyEntity { @Id @GenericGenerator(name ="my_generator", strategy ="org.common.MyEntityKeyGenerator") @GeneratedValue(generator ="my_generator") private Long id;... |
别忘了锁。
我使用生成类型Identity,这基本上意味着db负责ID生成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | @AllArgsConstructor @NoArgsConstructor @Getter @Setter @MappedSuperclass @EntityListeners(EntityListener.class) @EqualsAndHashCode(of = {"id","createdAt"}) public abstract class AbstractEntity<ID extends Serializable> implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private ID id; @Temporal(TemporalType.TIMESTAMP) @Column(name ="CREATED_AT", updatable = false) private Date createdAt; @Temporal(TemporalType.TIMESTAMP) @Column(name ="UPDATED_AT") private Date updatedAt; } |
您还可以使用序列生成:
1 2 3 4 5 6 | @Entity @SequenceGenerator(name="seq", initialValue=1, allocationSize=100) public class EntityWithSequenceId { @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq") @Id long id; } |