J'ai une application Spring Boot avec dépendance spring-boot-starter-data-jpa
. Ma classe d'entité a une annotation de colonne avec un nom de colonne. Par exemple:
@Column(name="TestName")
private String testName;
SQL généré par cela créé test_name
comme nom de colonne. Après avoir cherché une solution, j'ai trouvé qui a spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy
résolu le problème (le nom de la colonne provient de l'annotation de la colonne).
Pourtant, ma question est de savoir pourquoi sans naming_strategy défini sur EJB3NamingStrategy
JPA ignore l'annotation de colonne? Peut-être que le dialecte d'hibernation a quelque chose à voir avec ça? Je me connecte à MS SQL 2014 Express et mes journaux contiennent:
Unknown Microsoft SQL Server major version [12] using SQL Server 2000 dialect
Using dialect: org.hibernate.dialect.SQLServerDialect
java
hibernate
jpa
spring-boot
Kamil
la source
la source
@Column(name="...")
annotations, par exemple lorsque vous utilisez un type d'accès autre que prévu, mais ce n'est pas le cas ici.Réponses:
Pour hibernate5, j'ai résolu ce problème en mettant les lignes suivantes dans mon fichier application.properties:
la source
Par défaut, Spring utilise
org.springframework.boot.orm.jpa.SpringNamingStrategy
pour générer les noms de table. Il s'agit d'une extension très fine deorg.hibernate.cfg.ImprovedNamingStrategy
. LatableName
méthode de cette classe reçoit uneString
valeur source , mais elle ne sait pas si elle provient d'un@Column.name
attribut ou si elle a été générée implicitement à partir du nom de champ.Le
ImprovedNamingStrategy
sera convertiCamelCase
enSNAKE_CASE
où carEJB3NamingStrategy
il utilise simplement le nom de la table inchangé.Si vous ne souhaitez pas modifier la stratégie de dénomination, vous pouvez toujours simplement spécifier le nom de votre colonne en minuscules:
la source
Il paraît que
est complètement ignoré à moins qu'il n'y ait
spécifié, donc pour moi, c'est un bug.
J'ai passé quelques heures à essayer de comprendre pourquoi @Column (name = "..") était ignoré.
la source
La stratégie par défaut pour
@Column(name="TestName")
seratest_name
, c'est un comportement correct!Si vous avez une colonne nommée
TestName
dans votre base de données, vous devez remplacer l'annotation de colonne par@Column(name="testname")
.Cela fonctionne parce que la base de données ne se soucie pas si vous nommez votre colonne TestName ou testname (les noms de colonne sont insensibles à la casse !! ).
Mais attention, il n'en va pas de même pour le nom de la base de données et les noms de table, qui sont sensibles à la casse sur les systèmes Unix mais sensibles à la casse sur les systèmes Windows (le fait que beaucoup de gens restaient probablement éveillés la nuit, travaillant sous Windows mais déployant sous Linux :))
la source
La seule solution qui a fonctionné pour moi était celle publiée par teteArg ci-dessus. Je suis sur Spring Boot 1.4.2 avec Hibernate 5. À savoir
Pour plus d'informations, je publie la trace des appels afin que ce que Spring appelle clairement dans Hibernate pour configurer la stratégie de dénomination.
la source
teteArg , merci beaucoup. Juste une information supplémentaire, donc tout le monde se heurtant à cette question sera en mesure de comprendre pourquoi.
Ce que teteArg a dit est indiqué sur les propriétés communes de Spring Boot: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
Apparemment, spring.jpa.hibernate.naming.strategy n'est pas une propriété prise en charge pour l'implémentation Spring JPA utilisant Hibernate 5.
la source
Il s'avère que je dois juste convertir le
@column
nom testName en toutes les petites lettres, car il était initialement dans le cas du chameau.Bien que je n'ai pas pu utiliser la réponse officielle, la question a pu m'aider à résoudre mon problème en me laissant savoir sur quoi enquêter.
Changement:
À:
la source
Si vous voulez utiliser @Column (...), utilisez toujours des lettres minuscules même si votre colonne DB réelle est en cas de chameau.
Exemple: si votre nom de colonne DB réel est
TestName
alors utilisez:Si vous n'aimez pas cela, changez simplement le nom réel de la colonne DB en: test_name
la source
Dans mon cas, l'annotation était sur la méthode getter () au lieu du champ lui-même (porté à partir d'une application héritée).
Spring ignore également l'annotation dans ce cas, mais ne se plaint pas. La solution était de le déplacer sur le terrain au lieu du getter.
la source