Hibernate-sequence가 존재하지 않습니다.


88

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) 

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


4
구성 파일`<prop key = "hibernate.id.new_generator_mappings"> false </ prop>에서 설정을 시도하십시오
Eva Mariam

답변:


123

다음을 넣을 수도 있습니다.

@GeneratedValue(strategy = GenerationType.IDENTITY)

그리고 DateBase가 기본 키의 증가를 관리하도록합니다.

AUTO_INCREMENT PRIMARY KEY

13
이것은 어떤 경우에는 좋을 수도 있지만 명백한 단점이 있습니다. 모든 INSERT경우 데이터베이스에 대한 추가 왕복으로 인해 ID를 가져 오게됩니다. 따라서이 단점이 허용되면 괜찮습니다.
G. Demecki

@ G.Demecki이 왕복 방법과 달리 최대 절전 모드 ID 생성기를 사용할 때의 장단점에 대해 논의 할 수 있습니까? 정말 유용 할 것입니다!
요르단 맥키

82

Hibernate5.x <property name="hibernate.id.new_generator_mappings">false</property>.. 참조 및 링크 설정이 필요합니다 .

이전 버전의 최대 절전 모드 4.x의 경우 : <prop key="hibernate.id.new_generator_mappings">false</prop>


이것은 어디에서 추가됩니까?
Samuel Thompson

1
이것을 최대 절전 모드 속성에 추가하십시오.
rParvathi


10
귀하의 답변이 질문에 대한 해결책 일 수 있지만 문제가 해결 된 이유를 설명하지 않습니다. 링크가 죽는 경향이 있음을 명심하십시오.
Clijsters

51

스프링 부트 작업

해결책

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

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

설명

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


30

이 오류의 원인은 다음과 같습니다.

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


1
이것은 간단하게 설명하기 때문에 답변으로 표시되어야합니다. 물론 "spring.jpa.properties.hibernate.id.new_generator_mappings = false"의 추가가 언급되어야하지만 감사합니다.
nightfury

15

동일한 오류 "com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException : Table 'mylocaldb.hibernate_sequence'does not exist"가 나타납니다. "

Spring mvc 4.3.7 및 Hibernate 버전 5.2.9를 사용하여 Spring Java 기반 구성을 사용하여 응용 프로그램을 만듭니다. 이제 hibernate.id.new_generator_mappings@Eva Mariam이 언급 한 속성을 다음과 같이 코드 에 추가해야 합니다.

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

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


14

참고로

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

그것을주의해라:

Hibernate 5에서는 시퀀스 이름에 대한 매개 변수 이름이 변경되었습니다 .

다음 설정은 Hibernate 4 에서 잘 작동했습니다 .

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

그러나 Hibernate 5 에서는 동일한 매핑 설정 파일이 "hibernate_sequence does n't exist"오류를 발생시킵니다.

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

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

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

그리고 어떻게 든 그것에 대한 문서없는 것 같습니다 .

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


7

사용할 때

@GeneratedValue(strategy=GenerationType.AUTO)

또는

@GeneratedValue 위의 짧은 방법 인 Hibernate는 사용자에게 가장 적합한 생성 전략을 결정하기 시작합니다.이 경우에는

GenerationType.SEQUENCE 전략으로 삼고 있습니다.

schemaName.hibernate_sequence 시퀀스 기반 ID 생성을위한 테이블입니다.

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;

전략을 설정하면

@GeneratedValue(strategy = GenerationType.IDENTITY) .

Hibernate가 시퀀스 테이블 찾기를 중지하기 때문에 원래 문제가 해결됩니다.


6

오늘처럼 누군가 가이 문제로 머리카락을 뽑아 낼 경우를 대비하여 변경하기 전까지이 오류를 해결할 수 없었습니다.

spring.jpa.hibernate.dll-auto=create

...에

spring.jpa.properties.hibernate.hbm2ddl.auto=create

5

최대 절전 모드 5.x에서는 hibernate.cfg.xml에서 set 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>

2

다음을 넣을 수도 있습니다.

@GeneratedValue(strategy = GenerationType.IDENTITY)

그리고 DateBase가 기본 키의 증가를 관리하도록합니다.

AUTO_INCREMENT PRIMARY KEY

위의 답변이 도움이되었습니다.


1

Hibernate5 이전의 Hibernate 버전을 사용한다면 @GeneratedValue(strategy = GenerationType.IDENTITY)매력처럼 작동합니다. 그러나 Hibernate5 이후에는 다음 수정이 필요합니다.

@Id
@GeneratedValue(strategy= GenerationType.AUTO,generator="native")
@GenericGenerator(name = "native",strategy = "native")
private Long id;

DDL

`id` BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY

이유

최대 절전 문제 에서 발췌

현재 hibernate.id.new_generator_mappings가 false로 설정되면 @GeneratedValue (strategy = GenerationType.AUTO)가 native로 매핑됩니다. 이 속성이 true (5.x의 defult 값)이면 @GeneratedValue (strategy = GenerationType.AUTO)는 항상 SequenceStyleGenerator에 매핑됩니다.

이러한 이유로 기본적으로 시퀀스를 지원하지 않는 데이터베이스 (예 : MySQL)에서는 IDENTITY 대신 TABLE 생성기를 사용할 것입니다.

그러나 TABLE 생성기는 이식성이 더 높지만 데이터베이스에서 값을 가져올 때마다 별도의 트랜잭션을 사용합니다. 실제로 IDENTITY가 JDBC 배치 업데이트를 비활성화하고 TABLE 생성기가 풀링 된 최적화 프로그램을 사용하더라도 IDENTITY는 여전히 더 잘 확장됩니다.


0

이것은 수정 된 HHH-10876 때문일 수 있으므로 다음으로 업데이트하십시오.

  • 최대 절전 모드 ORM 5.2.1,
  • 최대 절전 모드 ORM 5.1.1,
  • 최대 절전 모드 ORM 5.0.11

1
내부적 Hibernate 5.2.17.Final으로 구현으로 사용중인 Spring-data-jpa를 사용 하고 있습니다. 이 경우 여전히이 문제 GenerationType가 발생 AUTO합니다.
TheCoder

0

postgres에 Hibernate 시퀀스를 추가했습니다. PostGres 편집기에서 다음 쿼리를 실행합니다.

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

쿼리 사용의 장단점을 찾을 수 있지만 도움이 필요한 사람은 이것을 사용할 수 있습니다.


0

제 경우에는 모든 주석 GenerationType.AUTO을 대체 GenerationType.SEQUENCE하여 문제 를 해결했습니다.


-2

이 쿼리 실행

create sequence hibernate_sequence start with 1 increment by 1

이 문제를 해결하는 방법 세부 사항을 공유 할 수 요청 당신의 대답은 ... 다른 답변보다 낫다
SURAJ 쿠마
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.