【问题标题】:@SequenceGenerator's initValue and allocationSize are ignored and generator not assigned to @Id field (H2, HIbernate, Spring)@SequenceGenerator 的 initValue 和 allocationSize 被忽略,并且生成器未分配给 @Id 字段(H2、HIbernate、Spring)
【发布时间】:2017-05-04 14:30:01
【问题描述】:

我在配置为使用嵌入式 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 - 创建序列 my_seq 以 1 递增 1 开始 17:22:29.237 [main] DEBUG org.hibernate.SQL - 创建表角色(id bigint 默认生成为标识,名称 varchar(255),主键 (id)) 17:22:29.248 [main] DEBUG org.hibernate.SQL - 创建表用户(id bigint not null,password_encoded varchar(255),username varchar(255),主键 (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]

我错过了什么?

【问题讨论】:

    标签: java spring hibernate jpa h2


    【解决方案1】:

    您的 JPA 设置是正确的,但您必须记住,当通过 Hibernate 或JPA API。

    当您在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 功能支持。

    【讨论】:

    • 没错,谢谢!但是,我仍然在为忽略 initiValue 参数而苦恼。我想为每个生成的 id 设置一个最小值。
    • 尝试设置此属性hibernate.id.new_generator_mappings=true
    • 完美!对我有用的配置参数是:spring.jpa.hibernate.use-new-id-generator-mappings。请您更新您的答案,包括此参数,以便我可以将其标记为已接受?
    猜你喜欢
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 2020-07-27
    • 2019-02-18
    • 2019-05-05
    • 2014-02-01
    相关资源
    最近更新 更多