2017-05-04 1 views
1

포함 된 H2 데이터베이스를 사용하도록 구성된 Spring 응용 프로그램에서 JPA를 사용합니다.@ 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 { 
} 

내가 볼 수

나는 다음과 같이 정의 된 사용자 개체가 있습니다.

: 행 삽입이 data.sql 파일에 의해 시도 될 때,로 초기 및 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-mappings 또는 hibernate.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

관련 문제