복붙노트

[SPRING] 최대 절전 시퀀스가 ​​존재하지 않습니다.

SPRING

최대 절전 시퀀스가 ​​존재하지 않습니다.

봄 4.2 버전으로 내 프로젝트에서 최대 절전 모드를 4에서 5로 업그레이드하려고했습니다. 이 업그레이드 후 업데이트 할 메소드를 호출했을 때 스택 추적에 다음 오류가 있음을 발견했습니다.

10:53:32,185 ERROR TableStructure:149 - could not read a hi value
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'test.hibernate_sequence' doesn't exist 

주석이있는 자동 증가 ID를 변경했습니다.

@GeneratedValue(strategy=GenerationType.AUTO) 

여전히 오류가 남아 있습니다.

해결법

  1. ==============================

    1.당신은 또한 넣을 수 있습니다 :

    당신은 또한 넣을 수 있습니다 :

    @GeneratedValue(strategy = GenerationType.IDENTITY)
    

    그리고 데이터베이스가 기본 키의 증가를 관리하도록하십시오.

    AUTO_INCREMENT PRIMARY KEY
    
  2. ==============================

    2. false 를 설정해야합니다. 링크 및 링크를 참조하십시오.

    false 를 설정해야합니다. 링크 및 링크를 참조하십시오.

  3. ==============================

    3.스프링 부트로 작업하기

    스프링 부트로 작업하기

    아래 문자열을 .application.properties에 넣으십시오.

    spring.jpa.properties.hibernate.id.new_generator_mappings=false
    

    Hibernate 4.X에서이 속성의 기본값은 true이다.

  4. ==============================

    4.이것이이 오류의 원인입니다.

    이것이이 오류의 원인입니다.

    사용중인 데이터베이스에서 ID를 생성하는 방법을 찾습니다. MySql 또는 HSQSL의 경우 증가하는 필드가 자동으로 증가합니다. Postgres 또는 Oracle에서는 시퀀스 테이블을 사용합니다. 시퀀스 테이블 이름을 지정하지 않았으므로 hibernate_sequence라는 시퀀스 테이블을 찾아서 기본값으로 사용합니다. 그래서 당신은 아마 당신의 데이터베이스에 그러한 시퀀스 테이블을 가지고 있지 않으며 이제 당신은 그 오류를 얻습니다.

  5. ==============================

    5.같은 오류가 발생했습니다 "com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException : 테이블 'mylocaldb.hibernate_sequence'가 존재하지 않습니다."

    같은 오류가 발생했습니다 "com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException : 테이블 'mylocaldb.hibernate_sequence'가 존재하지 않습니다."

    spring mvc 4.3.7과 hibernate version 5.2.9를 사용하면 스프링 자바 기반의 설정을 사용한다. 이제 @Eva Mariam이 언급 한 hibernate.id.new_generator_mappings 속성을 다음과 같이 추가해야합니다.

    @Autowired
        @Bean(name = "sessionFactory")
        public SessionFactory getSessionFactory(DataSource dataSource) {
    
            LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);
            sessionBuilder.addProperties(getHibernateProperties());
            sessionBuilder.addAnnotatedClasses(User.class);
    
            return sessionBuilder.buildSessionFactory();
        }
    
        private Properties getHibernateProperties() {
            Properties properties = new Properties();
            properties.put("hibernate.show_sql", "true");
            properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
            properties.put("hibernate.id.new_generator_mappings","false");
            return properties;
        }
    

    그리고 그것은 매력처럼 작동했습니다.

  6. ==============================

    6.참고로

    참고로

    hbm 파일을 사용하여 O / R 매핑을 정의하는 경우.

    그것을주의해라:

    Hibernate 5에서는 시퀀스 이름의 param 이름이 변경되었다.

    다음 설정은 Hibernate 4에서 정상적으로 작동했다 :

    <generator class="sequence">
        <param name="sequence">xxxxxx_seq</param>
    </generator>
    

    그러나 Hibernate 5에서 동일한 매핑 설정 파일은 "hibernate_sequence does not exist"오류를 일으킬 것이다.

    이 오류를 수정하려면 매개 변수 이름을 다음과 같이 변경해야합니다.

    <generator class="sequence">
        <param name="sequence_name">xxxxxx_seq</param>
    </generator>
    

    이 문제로 2, 3 시간을 낭비했습니다.

    그리고 어쨌든, 그것에 관한 문서가없는 것처럼 보입니다.

    나는 그것을 이해하기 위해 org.hibernate.id.enhanced.SequenceStyleGenerator의 소스 코드를 읽어야한다.

  7. ==============================

    7.Hibernate 5.x에서는 hibernate.cfg.xml에서 hibernate.id.new_generator_mappings을 false로 설정해야한다.

    Hibernate 5.x에서는 hibernate.cfg.xml에서 hibernate.id.new_generator_mappings을 false로 설정해야한다.

    <session-factory>
        ......
        <property name="show_sql">1</property>
        <property name="hibernate.id.new_generator_mappings">false</property>
         ......
     </session-factory>
    
  8. ==============================

    8.사용하면

    사용하면

    @ 생성 값 (전략 = GenerationType.AUTO)

    또는

    @GeneratedValue는 위의 짧은 손 방법이며, Hibernate는 가장 좋은 것을 결정하기 시작합니다.  당신을위한 세대 전략,이 경우에는

    GenerationType.SEQUENCE를 전략으로 사용하고 있으며 그 이유를 찾고 있습니다.

    스키마 기반 ID 생성을위한 테이블 인 schemaName.hibernate_sequence.

    전략으로 GenerationType.SEQUENCE를 사용하면 다음과 같이 @TableGenerator를 제공해야합니다.

         @Id
         @GeneratedValue(strategy = GenerationType.TABLE, generator = "user_table_generator")
         @TableGenerator(name = "user_table_generator",
                    table = "user_keys", pkColumnName = "PK_NAME", valueColumnName = "PK_VALUE")
         @Column(name = "USER_ID")
         private long userId;
    

    전략을 설정하면

    @ 생성 값 (전략 = GenerationType.IDENTITY).

    원래의 문제는 Hibernate가 시퀀스 테이블을 찾는 것을 멈추기 때문에 해결된다.

  9. ==============================

    9.이것은 수정 된 HHH-10876에 의해 야기 될 수 있습니다.

    이것은 수정 된 HHH-10876에 의해 야기 될 수 있습니다.

  10. ==============================

    10.postgres에 Hibernate 시퀀스를 추가했습니다. PostGres Editor에서이 쿼리를 실행하십시오 :

    postgres에 Hibernate 시퀀스를 추가했습니다. PostGres Editor에서이 쿼리를 실행하십시오 :

        CREATE SEQUENCE hibernate_sequence
      INCREMENT 1
      MINVALUE 1
      MAXVALUE 9223372036854775807
      START 2
      CACHE 1;
    ALTER TABLE hibernate_sequence
      OWNER TO postgres;
    

    나는 쿼리를 사용하는 데 찬반 양론을 찾아 낼 것이지만, 도움이 필요한 사람은 이것을 사용할 수있다.

  11. ==============================

    11.당신은 또한 넣을 수 있습니다 :

    당신은 또한 넣을 수 있습니다 :

    @GeneratedValue(strategy = GenerationType.IDENTITY)
    

    그리고 데이터베이스가 기본 키의 증가를 관리하도록하십시오.

    AUTO_INCREMENT PRIMARY KEY
    

    위의 대답은 나를 도왔다.

  12. from https://stackoverflow.com/questions/32968527/hibernate-sequence-doesnt-exist by cc-by-sa and MIT license