2017-01-28 19 views
7

Это сводит меня с ума.Spring Boot Hibernate 5 Игнорирование @Table и @Column

Я реализую Spring Social, и для этого требуется, чтобы у вас была таблица базы данных с именем UserConnection (вместо использования стандартного соглашения об именах с использованием подчеркивания для разделения двух слов).

Так что в моем наивном мировоззрении я предполагал, что его легко решить, указав @Table(name="UserConnection") ... но нет, это было бы слишком легко.

Аннотации игнорируются, и таблица создается как user_connection, которая затем приводит к тому, что Spring Social имеет шикарную форму.

Скажите, пожалуйста, что есть простой способ сообщить моему приложению Spring Boot просто назвать эту таблицу (и ее соответствующие столбцы), чтобы использовать соглашение об именах верблюдов, а не стандартное.

+0

Как настроить свое создание авто DDL? –

+0

также было бы неплохо, если бы вы добавили приложения application.properties и proerties, которые вы добавляете в sessionFactory. –

ответ

5

TL; DR

Добавить следующую строку в ваш application.yml файл:

spring: 
    jpa: 
    hibernate: 
     naming: 
     physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 

Или ваш application.properties:

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 

развернутый ответ

В Spring ботинке 1.4 release notes состояния:

SpringNamingStrategy больше не используется, так как Hibernate 5.1 удалил поддержка старого интерфейса NamingStrategy. Новый SpringPhysicalNamingStrategy теперь автоконфигурирован, который используется в комбинации с Hibernate по умолчанию ImplicitNamingStrategy. Этот должен быть очень близок к (если не идентичен) параметру Spring Boot 1.3 по умолчанию, однако вы должны проверить правильность схемы вашей базы данных при обновлении.

Этот новый PhysicalNamingStrategy следует принципам условного обозначения имен, рекомендованных по весеннему времени. В любом случае, если вам нужен полный контроль над физическим наименованием, вам лучше использовать org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl. Вы можете перейти к этой стратегии именования, добавив следующую строку в ваш application.yml:

spring: 
    jpa: 
    hibernate: 
     naming: 
     physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 

аннотации игнорируются, а таблица создаются как user_connection , которая затем вызывает Spring Social иметь hissy подгонку.

apply метод SpringPhysicalNamingStrategy является ключом к пониманию такого поведения:

private Identifier apply(Identifier name, JdbcEnvironment jdbcEnvironment) { 
    if (name == null) { 
     return null; 
    } 
    StringBuilder builder = new StringBuilder(name.getText().replace('.', '_')); 
    for (int i = 1; i < builder.length() - 1; i++) { 
     if (isUnderscoreRequired(builder.charAt(i - 1), builder.charAt(i), 
       builder.charAt(i + 1))) { 
      builder.insert(i++, '_'); 
     } 
    } 
    return getIdentifier(builder.toString(), name.isQuoted(), jdbcEnvironment); 
} 

private boolean isUnderscoreRequired(char before, char current, char after) { 
    return Character.isLowerCase(before) && Character.isUpperCase(current) 
      && Character.isLowerCase(after); 
} 

Это в основном заменяет любые . и тематические изменения (взгляните на isUnderscoreRequired метод) с подчеркиванием.

+0

Я пробовал так много вещей, я потерял трек. Я считаю, что когда я использовал этот метод, все остальные таблицы и столбцы, которые явно не были отображены с использованием символов подчеркивания, были воссозданы с использованием верблюжьего футляра. По сути, если я использую этот подход, мне придется проходить через каждый столбец и таблицу и добавлять аннотации, переопределяя их с помощью символа подчеркивания. – Trevor

+0

Да, я просто проверил его, и он ведет себя так, как я уже говорил выше. Все таблицы и столбцы, которые явно не указаны с помощью @Column и @Table, будут созданы в БД в виде верблюда. Это отстой, потому что я хочу абсолютно противоположный эффект. Я хочу, чтобы ТОЛЬКО явным образом отображал эту тупую таблицу UserConnection, а не все мои другие таблицы и столбцы. – Trevor

+0

@Trevor Тогда вы должны предоставить свою собственную 'ImplicitNamingStrategy' –

0

Вариант 1

Прежде всего определить свое имя таблицы на отображение @Entity:

@Entity(name = "UserConnections") 
public class UserConnection{ 

Вариант 2

Вы должны заплатить немного с NamingStrategy. Когда вы определяете свойства для SessionFactory фасоли, то попробуйте добавить следующее:

<prop key="hibernate.implicit_naming_strategy">legacy-jpa</prop> 

Когда объект не явно имя таблицы базы данных, что это карты для, мы должны безоговорочно определить, что имя таблицы. Или, когда конкретный атрибут явно не указывает столбец базы данных, который соответствует , нам необходимо неявно определить это имя столбца.

Поэтому, если вы не хотите явно указывать имена таблиц для каждого из объектов, вы должны следовать этой стратегии.

Вариант 3

В качестве альтернативы, если выше не работают для вас, вы должны использовать PhysicalNamingStrategy. Хотя это последнее средство в вашем случае:

Справочно: https://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/chapters/domain/naming.html