2017-11-23 2 views
2

단일 데이터 소스를 가진 "간단한"Spring Boot 애플리케이션이있다.Hibernate는 다른 스키마에서 이미 사용 가능할 때 시퀀스를 생성하지 않는다.

@Id 
@GeneratedValue(strategy = SEQUENCE, generator = "seq-pooled-lo") 
@GenericGenerator(
     name = "seq-pooled-lo", 
     strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator", 
     parameters = { 
       @org.hibernate.annotations.Parameter(
         name = SequenceStyleGenerator.INCREMENT_PARAM, 
         value = "50" 
       ), 
       @org.hibernate.annotations.Parameter(
         name = SequenceStyleGenerator.OPT_PARAM, 
         value = "pooled" 
       ), 
       @org.hibernate.annotations.Parameter(
         name = SequenceStyleGenerator.SEQUENCE_PARAM, 
         value = "seq_pooled_lo_sequence" 
       ) 
     }) 

이제 내 문제는 다음이다

spring: 
    jpa: 
    hibernate: 
     ddl-auto: update 
    properties: 
     hibernate: 
     default_schema: CORE 
flyway: 
    schemas: 
    - CORE 

하고 다음 ID 생성기 : 다음 구성 내 구성에 존재하는 나는이 응용 프로그램을 실행하면

것은, 그것은 만들 것 시퀀스 "CORE"스키마. 모든 것이 잘 작동합니다. 데이터 저장, 검색은 문제가되지 않습니다. 그런 다음 앱의 두 번째 인스턴스를 실행하지만 YAML 파일을 재정 의하여 다른 default_schema: SECOND을 정의하면 "SECOND"스키마에 새 시퀀스가 ​​생성되지 않습니다. 먼저 "SECOND"스키마를 정의한 상태로 앱을 시작한 다음 "CORE"로 시작하면 "CORE"가 아닌 "SECOND"스키마에 시퀀스가 ​​작성됩니다.

두 스키마에서 서로 다른 시퀀스를 생성 할 것으로 예상됩니다. 왜 그렇게하지 않습니까?

필자는 누락 된 스키마에 시퀀스를 수동으로 추가하려고했지만 슬프게도 도움이되지 않는 것으로 보입니다.

답변

0

시퀀스를 스키마에 수동으로 추가하는 경우. 당신은 defaultSchema

에 의해 반환 시퀀스 ID의 예로서 CustomIdGenerator 클래스를 만들 수 있습니다
public class CustomIdGenerator implements IdentifierGenerator { 

    @Override 
    public Serializable generate(SessionImplementor sessionImplementor, Object o) throws HibernateException { 
     SequenceRepository sequenceRepository = ApplicationContextProvider.getApplicationContext().getBean(SequenceRepository.class); 
     Environment env = ApplicationContextProvider.getApplicationContext().getBean(Environment.class); 

     String defaultSchema = env.getProperty("yourproperty.default_schema"); 

     return sequenceRepository.getSequence(defaultSchema); 

    } 
} 

은 시퀀스를 생성하기위한의이 SequenceRepository 클래스를 만들어 보자. 내 데이터베이스가 오라클이라고 가정합니다.

NEXTVAL : 증분 순서 및 다음 값

public interface SequenceRepository extends JpaRepository<Object,Long> { 
    @Query(value = "SELECT ?1.NEXTVAL FROM DUAL", nativeQuery = true) 
    Long getSequence(String sequenceName); 
} 

및 CustomGenerator 클래스

@Id 
@GenericGenerator(name = "sequence_generator", strategy = "yourpackage.CustomIdGenerator") 
@GeneratedValue(generator = "sequence_generator") 
@Column(name = "id") 
private Long id; 
+0

를 사용하여 당신의 엔티티 만 편집 전략을 반환 내가 정말 CustomIdGenerator가 필요하십니까? 나는 순진한 접근 방식이 내가 해낸 것처럼 왜 작동하지 않는지 알고 싶다. – Traspler