2017-05-04 3 views
1

JPアプリケーションを埋め込みH2データベースを使用するように設定したSpringアプリケーションで使用します。@ SequenceGeneratorのinitValueとallocationSizeは無視され、ジェネレータは@Idフィールド(H2、HIbernate、Spring)に割り当てられません。

@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 
} 

コンテキストは次のように定義されています:ログがMY_SEQが生成されていることを生成から

@Configuration 
@EnableWebMvc 
@EnableWebSecurity 
@EnableAutoConfiguration 
@EnableJpaRepositories(basePackages = "my.package") 
@EntityScan(basePackages = "my.package") 
@ComponentScan(basePackages = "my.package") 
public class AuthenticationWebAppContext extends WebSecurityConfigurerAdapter { 
} 

私が見ることができる

は、私はこのように定義されたUserエンティティを持っています。

:の行が挿入されたdata.sqlにファイルによって試みられたときしかし、はinitialValueとallocationSizeが完全に無視され、シーケンスが

 
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)) 

ように、ユーザーのidフィールドに割り当てられていない、私は次のエラーを得ました

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

JPAの設定は正しいですが、永続性プロバイダは、Hibernateを介して挿入するときにIDの生成(シーケンスの次の値のためのデータベースへの追加クエリ)のみを処理することに注意してくださいまたは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=trueinitialValue機能のサポートが可能になる(あなたが春のブートを使用していない場合)。

+0

ありがとうございます!しかし、私はまだ無視されているinitiValueパラメータで苦労しています。生成されたIDごとに最小値を設定したい。 – jilt3d

+0

このプロパティを設定しようとします。 'hibernate.id.new_generator_mappings = true' –

+0

パーフェクト!私のために働いた設定パラメータは 'spring.jpa.hibernate.use-new-id-generator-mappings'です。このパラメータを含めてあなたの答えを更新して、それを受け入れられるようにすることができますか? – jilt3d

関連する問題