이름이 JPA에서 예약된 단어인 엔티티 필드를 매핑하는 방법
@Column(name="open")
hibernate와 함께 sqlserver 사투리를 사용합니다.
[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'.
테이블을 작성할 때 따옴표로 둘러싸인 식별자를 사용하는 휴지 상태를 예상했습니다.
어떻게 대처해야 할지...필드 이름을 바꾸는 것 말고는?
Hibernate 를 JPA 1.0 프로바이더로서 사용하는 경우, 백틱내에 키워드를 둘러싸는 것으로, 예약 끝난 키워드를 이스케이프 할 수 있습니다.
@Column(name="`open`")
Hiberate Core에서 상속된 구문은 다음과 같습니다.
5.4. SQL 따옴표로 둘러싸인 식별자
매핑 문서의 백틱에 테이블 또는 열 이름을 포함하면 생성된 SQL의 식별자를 Hibernate로 따옴표로 묶을 수 있습니다.휴지 상태에서는 SQL 방언에 올바른 따옴표 스타일이 사용됩니다.이것은 보통 큰따옴표이지만 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\"")
레퍼런스
- 휴지 상태 참조 가이드
- JPA 2.0 사양
- 2.13 데이터베이스 객체의 명명
관련 질문
같은 문제가 있었지만, 라고 하는 이름의 태블명을 사용하고 있었습니다.Transaction
. 를 설정했을 경우
hibernate.globally_quoted_identifiers=true
그러면 모든 데이터베이스 식별자가 따옴표로 묶입니다.
여기서 내 답을 찾았습니다 테이블 이름에 특수 문자가 최대 절전 모드로 표시됨
사용 가능한 모든 설정은 https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/appendices/Configurations.html에서 확인했습니다.
그러나 이에 대한 더 나은 문서를 찾을 수 없습니다.
내 경우 설정은 Spring 속성 파일에 있습니다.코멘트에 기재되어 있듯이, 휴지 상태에 관련하는 다른 설정 파일에도 포함되어 있을 가능성이 있습니다.
예약된 키워드 수동 이스케이프
JPA 를 사용하고 있는 경우는, 큰따옴표로 이스케이프 할 수 있습니다.
@Column(name = "\"open\"")
Hibernate 네이티브 API를 사용하는 경우 backtick을 사용하여 이러한 API를 이스케이프할 수 있습니다.
@Column(name = "`open`")
예약된 키워드 자동 이스케이프
예약된 키워드를 자동으로 이스케이프하려면true
휴지 상태 고유의 설정 속성:
<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\"")
이것은 확실히 동작합니다.동면 상태 학습을 하고 있을 때, 같은 문제가 발생했습니다.
다른 옵션도 있습니다: 휴지 상태.auto_module_module
어떤.
키워드로 간주되는 이름을 자동으로 따옴표로 묶을지 여부를 지정합니다.
<property name="hibernate.auto_quote_keyword" value="true" />
야무
spring:
jpa:
properties:
hibernate:
auto_quote_keyword: true
아니요 - 열 이름을 변경합니다.
이것은 데이터베이스별로 다르므로 이러한 열을 만들 수 없습니다.모든 휴지 상태가 종료된 후 DDL이 데이터베이스로 전송됩니다.이 열 이름으로 유효한 DDL을 만들 수 없는 경우 휴지 상태에서도 만들 수 없습니다.DDL을 작성해도 견적으로는 해결되지 않을 것 같습니다.
어떻게든 이름에서 벗어나더라도 바꾸세요.이 데이터베이스에서는 작동하지만 다른 데이터베이스에서는 작동하지 않습니다.
일부 JPA 구현(예: 내가 사용하는 Data Nucleus)은 자동으로 식별자를 인용하기 때문에 이 정보를 얻을 수 없습니다.
언급URL : https://stackoverflow.com/questions/2224503/how-to-map-an-entity-field-whose-name-is-a-reserved-word-in-jpa
'programing' 카테고리의 다른 글
공통 MySQL 필드 및 해당 데이터 유형 (0) | 2023.01.01 |
---|---|
호스트에서 도커 컨테이너의 mysql에 연결 (0) | 2023.01.01 |
Java 8의 기본 가비지 수집기 (0) | 2023.01.01 |
봄 JPA @LIKE와 함께 쿼리 (0) | 2023.01.01 |
단일 테이블 쿼리 속도가 매우 느림(인덱스 사용 MariaDB (0) | 2023.01.01 |