[英]@SequenceGenerator's initValue and allocationSize are ignored and generator not assigned to @Id field (H2, HIbernate, Spring)
我在配置為使用嵌入式 H2 數據庫的 Spring 應用程序中使用 JPA。
我有一個像這樣定義的用戶實體:
@Entity
@SequenceGenerator(name = "myseq", sequenceName = "MY_SEQ", initialValue = 1000, allocationSize = 1)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "myseq")
private Long id;
@Column(name = "USERNAME")
private String userName;
@Column(name = "PASSWORD_ENCODED")
private String passwordEncoded;
@ManyToMany
@JoinTable(name = "USER_ROLES", joinColumns = @JoinColumn(name = "USER_ID", referencedColumnName = "ID"), inverseJoinColumns = @JoinColumn(name = "ROLE_ID", referencedColumnName = "ID"))
private Set<Role> roles;
}
//getters
}
上下文定義如下:
@Configuration
@EnableWebMvc
@EnableWebSecurity
@EnableAutoConfiguration
@EnableJpaRepositories(basePackages = "my.package")
@EntityScan(basePackages = "my.package")
@ComponentScan(basePackages = "my.package" )
public class AuthenticationWebAppContext extends WebSecurityConfigurerAdapter {
}
從生成的日志中可以看出生成了MY_SEQ。 但是,initialValue 和 allocationSize 被完全忽略,序列沒有分配給 USER 的 id 字段
17:22:29.236 [main] DEBUG org.hibernate.SQL - create sequence my_seq start with 1 increment by 1 17:22:29.237 [main] DEBUG org.hibernate.SQL - create table role (id bigint generated by default as identity, name varchar(255), primary key (id)) 17:22:29.248 [main] DEBUG org.hibernate.SQL - create table user (id bigint not null, password_encoded varchar(255), username varchar(255), primary key (id))
因此,當 data.sql 文件嘗試行插入時,出現以下錯誤:
Caused by: org.h2.jdbc.JdbcSQLException: NULL not allowed for column "ID"; SQL statement:
INSERT INTO user (USERNAME, PASSWORD_ENCODED) VALUES ('user1', '<some_giberish>') [23502-194]
我缺少什么?
您的 JPA 設置是正確的,但您必須記住,當通過 Hibernate 或 JPA API 插入時,持久性提供程序只會為您生成 id(對數據庫的附加查詢以獲取序列的下一個值)。
當您在data.sql
文件中“手動”執行插入時,不會發生這種情況。 您必須在那里手動調用序列:
INSERT INTO user (ID, USERNAME, PASSWORD_ENCODED)
VALUES (NEXTVAL('my_seq')'user1', '<some_giberish>')
編輯
此屬性: spring.jpa.hibernate.use-new-id-generator-mappings
或hibernate.id.new_generator_mappings=true
(如果您不使用 spring boot)將允許initialValue
功能支持。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.