当前位置: 首页 > 知识库问答 >
问题:

忽略@SequenceGenerator的initValue和allocationSize,生成器未分配给@ID字段(H2,HIbernate,spring)

尤飞尘
2023-03-14

我在一个配置为使用嵌入式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]

我错过了什么?

共有1个答案

邓阳嘉
2023-03-14

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

 类似资料:
  • 问题内容: 我们都知道使用Hibernate时的默认行为-它使实际数据库序列增加 一 ,将该值乘以50(默认值)-然后将该值用作实体ID。 这是错误的行为,并与说明以下内容的规范冲突: distributionSize-(可选)从序列中分配序列号时要增加的数量。 需要明确的是:我不关心生成的ID之间的差距。 我关心与基础数据库序列 不一致的 ID 。例如:任何其他应用程序(例如,使用纯JDBC)可

  • 在尝试创建具有自动生成ID的表时,我遇到了一个异常: commandAcceptanceException:“执行DDL时出错”create table seat(id bigint not null,description varchar(255),num integer not null,PROCY decimal(19,2),row char(255)not null,primary key

  • 我正在eclipse中使用protoc jar maven插件(3.11.4)从proto文件自动生成grpc存根。在生成代码时,我注意到proto中的my Bool数据类型字段(“proto3”)并不是生成的类的一部分。 不知道为什么只有bool数据类型字段会丢失,因为所有字符串数据类型都正确地出现在哪里。

  • 我正在测试JPA2。1和新的“模式生成”功能。为此,我在HyperSQL数据库下测试了两个实现: Eclipse Link 2.5.2-M1,它是参考实现。 Hibernate4.3 我对实现没有任何偏好(甚至对性能也没有偏好)。我测试了EclipseLink,因为它是第一个JPA2。1实现可用,但现在,Hibernate4.3在这里,JPA2也在这里。1合规。我唯一想要的是获得独立于JPA提供者

  • 我有一个java Spring Boot项目,需要在MySQL和Oracle数据库上运行。该项目在数据库中有多个主键设置为自动递增的实体。 我已经确定,Hibernate的@GenericGenerator在本机策略中将支持MySQL(作为身份)和Oracle(作为序列),这取决于DB的类型。但是我似乎找不到如何在GenericGenerator中为oracle序列设置allocationSize

  • 问题内容: 假设以下模型: 以及以下DQL查询: 生成的SQL将是: 现在要问的问题:如何从该查询中删除该子句。在更复杂的查询中,该子句的这一部分使得无法使用某些已定义的索引。这可以通过添加索引来解决,但这会使我的索引变大,我觉得这是没有必要的。 该是在继承树的根。因此,我们对表中的所有记录都感兴趣。省略零件就可以做到这一点。 所以问题是:在没有必要的情况下,我该如何使Doctrine删除此部分。