web-dev-qa-db-ja.com

JPAを使用して予約されたWord名でフィールドを作成する

@Column(name="open")

休止状態で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'.

テーブルを作成するときに、休止状態が引用識別子を使用することを期待していました。

フィールドの名前を変更する以外に、これを処理する方法に関するアイデアはありますか?

72
TJR

同じ問題がありましたが、Transactionと呼ばれるテーブル名がありました。設定した場合

hibernate.globally_quoted_identifiers=true

その後、すべてのデータベース識別子が引用されます。

ここに私の答えを見つけました エラーを与えるテーブル名休止状態の特殊文字

そして、ここで利用可能なすべての設定を見つけました https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/appendices/Configurations.html

しかし、これに関するより良いドキュメントを見つけることができませんでした。

私の場合、設定は私のSpringプロパティファイルにありました。コメントで述べたように、それは他の、休止状態に関連する構成ファイルにもある可能性があります。

40
Rafiek

HibernateをJPA 1.0プロバイダーとして使用すると、予約されたキーワードをバックティックで囲むことでエスケープできます。

@Column(name="`open`")

これは、Hiberate Coreから継承された構文です。

5.4。SQL引用識別子

マッピングドキュメントのテーブルまたは列の名前をバックティックで囲むことにより、生成されたSQLでHibernateに識別子を強制的に引用させることができます。 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\"")

参照資料

  • Hibernateリファレンスガイド
  • JPA 2.0仕様
    • 2.13データベースオブジェクトの命名

関連する質問

120
Pascal Thivent

以下に示すように使用すると、動作するはずです

@Column(name="[order]")
private int order;
15
Raman
@Column(name="\"open\"")

これは確かに機能します。私が休止状態を学んでいたときに、同じ問題が私にも起こりました。

10
wmnitin

予約されたキーワードを手動でエスケープする

JPAを使用している場合は、二重引用符でエスケープできます。

@Column(name = "\"open\"")

HibernateネイティブAPIを使用している場合、バックティックを使用してそれらをエスケープできます。

@Column(name = "`open`")

予約済みキーワードを自動的にエスケープする

予約済みキーワードを自動的にエスケープしたい場合は、trueにHibernate固有のhibernate.globally_quoted_identifiers構成プロパティ:

<property
    name="hibernate.globally_quoted_identifiers"
    value="true"
/>

詳細については、 この記事 をご覧ください。

5
Vlad Mihalcea

いいえ-列名を変更します。

これはデータベース固有であり、このような列を作成することはできません。結局、休止状態は最終的にDDLをデータベースに送信します。この列名で有効なDDLを作成できない場合、これはhibernateも同様にできないことを意味します。 DDLを作成している場合でも、引用によって問題が解決するとは思わない。

名前のエスケープに成功したとしても、名前を変更してください。このデータベースでは機能しますが、別のデータベースでは機能しません。

4
Bozho

一部のJPA実装(たとえば、私が使用しているもの、DataNucleus)は自動的に識別子を引用するため、これを取得することはありません。

1
Neil Stockton