programing tip

JPA로 예약어 이름으로 필드 만들기

itbloger 2020. 10. 23. 07:39
반응형

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

참고 문헌

관련 질문


아래 그림과 같이 사용하면 작동합니다.

@Column(name="[order]")
private int order;

@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"
/>

자세한 내용은 이 도움말을 확인 하세요 .


아니요-열 이름을 변경합니다.

This is database-specific, and you just can't create such a column. After all hibernate finally sends DDL to the database. If you can't create a valid DDL with this column name, this means hibernate can't as well. I don't think quoting would solve the issue even if you are writing the DDL.

Even if you somehow succeed to escape the name - change it. It will work with this database, but won't work with another.


Some JPA implementations (e.g the one I use, DataNucleus) automatically quote the identifier for you, so you never get this.

참고URL : https://stackoverflow.com/questions/2224503/creating-field-with-reserved-word-name-with-jpa

반응형