programing

이름이 JPA에서 예약된 단어인 엔티티 필드를 매핑하는 방법

luckcodes 2023. 1. 1. 12:13

이름이 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\"")

레퍼런스

관련 질문

같은 문제가 있었지만, 라고 하는 이름의 태블명을 사용하고 있었습니다.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