JPA'da adı ayrılmış bir kelime olan bir varlık alanı nasıl eşlenir


92
@Column(name="open")

Hazırda bekletme ile sqlserver lehçesini kullanma.

[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'.

Tabloyu oluştururken alıntılanan tanımlayıcıyı kullanmak için hazırda bekletmeyi beklerdim.

Alanın adını değiştirmek dışında bunun nasıl ele alınacağına dair bir fikriniz var mı?


Yanıtlar:


55

Aynı sorunu yaşadım, ancak bir tablename deniyordu Transaction. Eğer ayarlarsan

hibernate.globally_quoted_identifiers=true

Daha sonra tüm veritabanı tanımlayıcıları alıntılanacaktır.

Cevabımı burada buldum Tablo adındaki özel karakter hazırda beklemede hata veriyor

Ve mevcut tüm ayarları burada bulabilirsiniz https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/appendices/Configurations.html

Yine de bunun için daha iyi belgeler bulamadı.

Benim durumumda, ayar Bahar özellikleri dosyamdaydı. Yorumlarda belirtildiği gibi, diğer, hazırda bekletme ile ilgili yapılandırma dosyalarında da olabilir.


9
Bu nasıl varsayılan ayar olmaz?
Josh M.

SQL okunamaz hale gelebilir ve anahtar kelimeleri ad olarak kullanmak, teşvik edilmemesi gereken kötü bir uygulamadır. Bence...?
Rafiek

1
Tamam. Tüm gün boyunca kaçan ayrılmış bir kelimeyi, uymayan bir ad yerine ad olarak tercih ederim.
Josh M.

Evet, Hibernate tarafından sağlanan soyutlamanın teknik olarak nasıl uygulandığını değil, yalnızca endişe verici olduğunu söyleyebilirsin. Ancak Flyway veya Liquibase gibi araçları da kullanırsanız, ayrılmış kelimeler olabileceğini düşünmeniz gerektiğinde karmaşıklığa katkıda bulunur. Şemaları taşırken bu benim deneyimim oldu.
Rafiek

2
Bunun nereye ayarlanması gerektiğini merak edenler için, muhtemelen persistence.xmlJBoss projelerinizdedir.
Addison

138

JPA 1.0 sağlayıcısı olarak Hazırda Beklet seçeneğiyle, ayrılmış bir anahtar kelimeyi arka işaretler içine alarak kaçabilirsiniz:

@Column(name="`open`")

Bu, Hiberate Core'dan miras alınan sözdizimidir:

5.4. SQL alıntı tanımlayıcıları

Hazırda Bekletme'yi, eşleme belgesindeki tabloyu veya sütun adını arka işaretlere ekleyerek oluşturulan SQL'de bir tanımlayıcı alıntı yapmaya zorlayabilirsiniz. Hazırda bekletme, SQL Diyaloğu için doğru teklif stilini kullanacaktır. Bu genellikle çift tırnaktır, ancak SQL Server parantez kullanır ve MySQL ters işaretler kullanır.

<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'da sözdizimi standartlaştırılmıştır ve şu hale gelir:

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

Referanslar

İlgili sorular


Ve benden teşekkürler. Sahip olduğum bir sorunu çözdü. btw - Referans şu anda şu adreste: docs.jboss.org/hibernate/stable/core/manual/en-US/html/…
Steve

5
Bunu neden yapmak zorunda olduğumu anlamıyorum, neden Hibernate bunu benim yerime otomatik olarak yapmıyor ???
Daniel Hári

@ DanielHári belki cevabımı daha "otomatik" buluyorsunuz?
Rafiek

1
@Rafiek: Oh evet, bu mükemmel bir çözüm, olumlu oy verildi (y).
Daniel Hári

1
Kullanmak @Column(name="[open]")çok daha güzel :)
Waleed Abdalmajeed

16

Ayrılmış anahtar kelimelerden manuel olarak çıkış

JPA kullanıyorsanız, çift tırnak işareti ile kaçabilirsiniz:

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

Hazırda Bekletme yerel API'sini kullanıyorsanız, geri işaretlerini kullanarak bunlardan kaçabilirsiniz:

@Column(name = "`open`")

Ayrılmış anahtar kelimelere otomatik olarak çıkış

Ayrılmış anahtar sözcüklerden otomatik olarak çıkmak istiyorsanız true, Hazırda Bekletmeye özel hibernate.globally_quoted_identifiersyapılandırma özelliğini ayarlayabilirsiniz :

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

Yaml biçimi

spring:
  jpa:
    properties:
      hibernate:
        globally_quoted_identifiers: true

Daha fazla ayrıntı için bu makaleye göz atın .


15

Aşağıda gösterildiği gibi kullanırsanız çalışmalıdır

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

Bunu alıcıda değil de özel alanda mı yapıyorsun?
Jake Gaston

5
bu sqlserver'a özgüdür.
Alfredo M

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

Bu kesinlikle işe yarayacak, Hazırda bekletmeyi öğrenirken benimle aynı sorun oldu.


4

Hayır - sütun adını değiştirin.

Bu, veritabanına özgüdür ve böyle bir sütun oluşturamazsınız. Tüm hazırda bekletme modlarından sonra, DDL'yi veritabanına gönderir. Bu sütun adıyla geçerli bir DDL oluşturamazsanız, bu, hazırda bekletme de yapamayacağınız anlamına gelir. DDL yazıyor olsanız bile alıntı yapmanın sorunu çözeceğini sanmıyorum.

İsimden bir şekilde kaçmayı başarsanız bile - değiştirin. Bu veritabanıyla çalışacak, ancak başka biriyle çalışmayacaktır.


Bu olabilir çalışır. Bkz stackoverflow.com/questions/285775/... . OP onayını bekleyelim.
ewernli

1
Bu, veritabanına özgü değildir! Bir `ve hazırda bekletme ile SQL Diyaloğu için doğru teklif stiline çevirin
Daniel Käfer

2

Bazı JPA uygulamaları (örneğin benim kullandığım DataNucleus) sizin için tanımlayıcıyı otomatik olarak alıntı yapar, böylece bunu asla alamazsınız.


Evet, Hibernate'in, insanlara kaç kez vurulduğu göz önüne alındığında bu kadar basit bir özellik sunmamasına şaşırdım (ve hatta birisi bunun başka bir yerde mümkün olduğunu söylemeye cesaret ettiğiniz için sizi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.