@Column(name="open")
Używanie dialektu sqlserver z hibernacją.
[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'.
Spodziewałbym się, że hibernacja użyje identyfikatora w cudzysłowie podczas tworzenia tabeli.
Jakieś pomysły, jak sobie z tym poradzić ... inne niż zmiana nazwy pola?
Odpowiedzi:
Miałem ten sam problem, ale z nazwą tabeli o nazwie
Transaction
. Jeśli ustawiszhibernate.globally_quoted_identifiers=true
Następnie wszystkie identyfikatory bazy danych zostaną zacytowane.
Znalazłem moją odpowiedź tutaj Znak specjalny w nazwie tabeli hibernuje, dając błąd
Wszystkie dostępne ustawienia znalazłem tutaj https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/appendices/Configurations.html
Nie mogłem jednak znaleźć lepszych dokumentów do tego.
W moim przypadku ustawienie było w moim pliku właściwości Spring. Jak wspomniano w komentarzach, może on również znajdować się w innych plikach konfiguracyjnych związanych z hibernacją.
źródło
persistence.xml
projektach JBoss.Z Hibernate jako dostawcą JPA 1.0, możesz ominąć zarezerwowane słowo kluczowe, umieszczając je między znakami odwrotnymi:
@Column(name="`open`")
Oto składnia odziedziczona po Hiberate Core:
W JPA 2.0 składnia jest ustandaryzowana i wygląda następująco:
@Column(name="\"open\"")
Bibliografia
Powiązane pytania
źródło
@Column(name="[open]")
jest o wiele ładniejsze :)Ręczna zmiana znaczenia zarezerwowanych słów kluczowych
Jeśli korzystasz z JPA, możesz uciec za pomocą podwójnych cudzysłowów:
@Column(name = "\"open\"")
Jeśli korzystasz z natywnego interfejsu API Hibernate, możesz uciec przed nimi za pomocą odwrotnych znaków:
@Column(name = "`open`")
Automatyczna zmiana znaczenia zarezerwowanych słów kluczowych
Jeśli chcesz automatycznie uniknąć zarezerwowanych słów kluczowych, możesz ustawić właściwość konfiguracyjną
true
specyficzną dla Hibernatehibernate.globally_quoted_identifiers
:<property name="hibernate.globally_quoted_identifiers" value="true" />
Format Yaml
spring: jpa: properties: hibernate: globally_quoted_identifiers: true
Więcej informacji znajdziesz w tym artykule .
źródło
Jeśli używasz jak pokazano poniżej, powinno działać
@Column(name="[order]") private int order;
źródło
@Column(name="\"open\"")
To na pewno zadziała, ten sam problem zdarzył się ze mną, kiedy uczyłem się hibernacji.
źródło
Nie - zmień nazwę kolumny.
Jest to specyficzne dla bazy danych i po prostu nie możesz utworzyć takiej kolumny. Po hibernacji ostatecznie wysyła DDL do bazy danych. Jeśli nie możesz utworzyć prawidłowego DDL z tą nazwą kolumny, oznacza to, że hibernacja również nie może. Nie sądzę, aby cytowanie rozwiązało problem, nawet jeśli piszesz DDL.
Nawet jeśli jakoś uda ci się uciec od nazwy - zmień ją. Będzie działać z tą bazą danych, ale nie będzie działać z inną.
źródło
Niektóre implementacje JPA (np. Ta, której używam, DataNucleus) automatycznie cytują dla Ciebie identyfikator, więc nigdy go nie otrzymasz.
źródło