Hibernate переименовывает некоторые столбцы при запуске Spring Boot 1.4 - PullRequest
0 голосов
/ 11 мая 2018

У меня проблемы с столбцами базы данных PostgreSQL в некоторых таблицах.

Если я объявляю столбец String с именем типа a_column_name Hibernate принимает столбец таблицы с именем a_column_name.

Но моя проблема возникает, когда я объявляю тип столбца Integer или BigDecimal. При запуске Hibernate создает новый столбец типа int4 или numeric(19, 2) с именем, например acolumnname , с NULL.

Hibernate: alter table t_myTable add column acolumnname int4

или

Hibernate: alter table t_myTable add column acolumnname numeric(19, 2)

Я попытался установить имя-стратегию в конфигурационном файле Spring boot :

jpa:
    show-sql: true
    hibernate:
      ddl-auto: update
    properties:
      hibernate.cache.use_second_level_cache: false
      hibernate.cache.use_query_cache: false
      hibernate.generate_statistics: true
      naming.physical-strategy: PhysicalNamingStrategyStandardImpl

Но без результата ...

Поэтому мой вопрос заключается в том, почему Hibernate принимает имя столбца, когда оно имеет тип String , но не любит его, когда оно Integer или BigDecimal .

Привет.

---- Обновление 1 ----

После поиска в организации, чтобы опубликовать здесь код, как Веселин Давыдов спросил, я заметил, что некоторые столбцы принимаются, а другие нет.

Сущности создаются из структуры компании, которая анализирует JSON со структурой БД (таблицы, поля, тип полей ...) и генерирует класс сущностей JAVA. Поэтому после просмотра ответа от SAM я изменил код шаблона Entity, добавив @Column(name = "your_column_name"). Теперь, когда Hibernate запускается, он не добавляет столбцы с неправильными именами и использует столбцы DB.

1 Ответ

0 голосов
/ 11 мая 2018

, если ваш класс сущности Hibernate подобен следующему:

@Entity
public class Registration{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    @Column
    @Basic
    private String name;

    // getters and setters

}

тогда в вашей регистрационной таблице будут поля с именами "id" и "name", как вы использовали auto-ddl=update. Чтобы избежать этого, вы можете указать имена столбцов с помощью @Column(name = "your_column_name"), как показано ниже:

@Table(name = "registration")
@Entity
public class Registration{

   @Id
   @Column(name = "r_id")
   @GeneratedValue(strategy = GenerationType.AUTO)
   private int id;

   @Basic
   @Column(name = "r_name")
   private String name;

   // getters and setters

}

Если вы используете Intellij IDEA, тогда среда IDE может сгенерировать необходимый класс сущностей.

Вы можете перейти на вкладку персистентности -> щелкнуть правой кнопкой мыши по названию проекта -> Создать сопоставление персистентности -> По схеме базы данных. Затем выберите таблицы, сущность которых вы хотите сгенерировать. Вуаля, все приходит легко.

Теперь перейдем к вашей проблеме, в вашем классе Entity, если вы установите поле с типом Integer, тогда он обновит вашу таблицу до int4 и с allow null. BigDecimal также совпадает с numeric(10,2) с allow null. Чтобы избежать allow null в вашей базе данных, используйте примитивы типа int и double.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...