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

@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\"")

참고 문헌

관련 질문


답변

예약 된 키워드를 수동으로 이스케이프

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)은 식별자를 자동으로 인용하므로 절대 얻을 수 없습니다.