@Column(name="open")
최대 절전 모드에서 sqlserver dialect 사용.
[SchemaUpdate] Unsuccessful: create table auth_session (id numeric(19,0) identity not null, active tinyint null, creation_date datetime not null, last_modified datetime not null, maxidle int null, maxlive int null, open tinyint null, sessionid varchar(255) not null, user_id numeric(19,0) not null, primary key (id), unique (sessionid))
[SchemaUpdate] Incorrect syntax near the keyword 'open'.
테이블을 만들 때 따옴표 붙은 식별자를 사용하려면 최대 절전 모드가 필요했습니다.
필드 이름을 바꾸는 것 외에 이것을 처리하는 방법에 대한 아이디어가 있습니까?
답변
같은 문제가 있었지만 테이블 이름이 Transaction
. 설정하면
hibernate.globally_quoted_identifiers=true
그런 다음 모든 데이터베이스 식별자가 인용됩니다.
여기에 내 대답을 찾았
습니다. 테이블 이름의 특수 문자가 오류를 일으키는 최대 절전 모드
그리고 여기에서 사용 가능한 모든 설정을 찾았습니다
https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/appendices/Configurations.html
그래도 더 나은 문서를 찾을 수 없습니다.
제 경우에는 설정이 Spring 속성 파일에있었습니다. 주석에서 언급했듯이 다른 최대 절전 모드 관련 구성 파일에있을 수도 있습니다.
답변
Hibernate를 JPA 1.0 공급자로 사용하면 예약 된 키워드를 백틱으로 묶어 이스케이프 할 수 있습니다.
@Column(name="`open`")
다음은 Hiberate Core에서 상속 된 구문입니다.
5.4. SQL 인용 식별자
매핑 문서에서 테이블 또는 열 이름을 백틱으로 묶어 Hibernate가 생성 된 SQL에서 식별자를 인용하도록 할 수 있습니다. Hibernate는 SQL Dialect에 대해 올바른 인용 스타일을 사용합니다. 일반적으로 큰 따옴표이지만 SQL Server는 대괄호를 사용하고 MySQL은 백틱을 사용합니다.
<class name="LineItem" table="`Line Item`"> <id name="id" column="`Item Id`"/><generator class="assigned"/></id> <property name="itemNumber" column="`Item #`"/> ... </class>
JPA 2.0에서 구문은 표준화되고 다음과 같이됩니다.
@Column(name="\"open\"")
참고 문헌
- Hibernate 참조 가이드
- JPA 2.0 사양
- 2.13 데이터베이스 개체 이름 지정
관련 질문
답변
예약 된 키워드를 수동으로 이스케이프
JPA를 사용하는 경우 큰 따옴표로 이스케이프 할 수 있습니다.
@Column(name = "\"open\"")
Hibernate 네이티브 API를 사용하는 경우 백틱을 사용하여 이스케이프 할 수 있습니다.
@Column(name = "`open`")
예약 된 키워드 자동 이스케이프
예약 된 키워드를 자동으로 이스케이프 true
하려면 Hibernate 관련 hibernate.globally_quoted_identifiers
구성 속성으로 설정할 수 있습니다.
<property
name="hibernate.globally_quoted_identifiers"
value="true"
/>
Yaml 형식
spring:
jpa:
properties:
hibernate:
globally_quoted_identifiers: true
답변
아래 그림과 같이 사용하면 작동합니다.
@Column(name="[order]")
private int order;
답변
@Column(name="\"open\"")
이것은 확실히 작동 할 것입니다. 제가 최대 절전 모드를 배우고있을 때 저에게도 같은 문제가 발생했습니다.
답변
아니요-열 이름을 변경합니다.
이것은 데이터베이스에 따라 다르며 이러한 열을 만들 수 없습니다. 결국 최대 절전 모드는 DDL을 데이터베이스로 보냅니다. 이 열 이름으로 유효한 DDL을 만들 수 없으면 최대 절전 모드도 할 수 없음을 의미합니다. DDL을 작성하더라도 인용으로 문제가 해결되지 않는다고 생각합니다.
어떻게 든 이름을 벗어나는 데 성공하더라도 이름을 변경하십시오. 이 데이터베이스에서는 작동하지만 다른 데이터베이스에서는 작동하지 않습니다.
답변
일부 JPA 구현 (예 : 내가 사용하는 DataNucleus)은 식별자를 자동으로 인용하므로 절대 얻을 수 없습니다.