簡體   English   中英

@SequenceGenerator 的 initValue 和 allocationSize 被忽略,生成器沒有分配給 @Id 字段(H2、HIbernate、Spring)

[英]@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-mappingshibernate.id.new_generator_mappings=true (如果您不使用 spring boot)將允許initialValue功能支持。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM