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\"")
참고 문헌
- Hibernate 참조 가이드
- JPA 2.0 사양
- 2.13 데이터베이스 개체 이름 지정
관련 질문
아래 그림과 같이 사용하면 작동합니다.
@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
'programing tip' 카테고리의 다른 글
BIT 필드에 MIN 집계 함수 적용 (0) | 2020.10.23 |
---|---|
부트 스트랩의 7 개의 동일한 열 (0) | 2020.10.23 |
Python에서 []없이 목록 이해 (0) | 2020.10.23 |
자바에서 날짜에 요일 추가 (0) | 2020.10.23 |
Lodash를 사용하여 자바 스크립트 배열을 청크로 분할 (0) | 2020.10.23 |