Исключение при проверке метания гибернации «обнаружен неправильный тип столбца в столбце», даже когда мой сценарий DDL и сущность JPA синхронизированы - PullRequest
5 голосов
/ 03 июля 2019

Я запускаю свой spring контейнер в режиме validate

AutoDDL = Validate

Я получаю исключение для проверки, как это

Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema- 
validation: wrong column type encountered in column [amount] in table [Balance]; 
found [numeric (Types#NUMERIC)], but expecting [int8 (Types#BIGINT)]

и мой сценарий DDL выглядит так

CREATE TABLE Balance(stratr VARCHAR(25), histFromDate TIMESTAMP WITHOUT TIME 
ZONE,amount  numeric(11, 0))

и мой атрибут в сущности JPA выглядит следующим образом

 @Column(name="amount", precision=11, scale=0) //have specified precision and scale
 private Long amount  ;

где я использовал import javax.persistence.Column. Так как я аннотировал точную точность и масштаб, разве гибернация не должна проверяться с этой информацией, которую я предоставил через аннотацию столбца? Что я мог пропустить?

Я не могу сделать следующее

  @Column(
   columnDefinition = "NUMERIC(11,0)"
   )
  private Long amount;

потому что я не знаю хранилище данных этой сущности JPA.

Я также попытался сгенерировать скрипт по следующему свойству

<prop key="javax.persistence.schema-generation.scripts.action">drop-and-create</prop>
<prop key="javax.persistence.schema-generation.scripts.create-target">./l/create.sql</prop>
<prop key="javax.persistence.schema-generation.scripts.drop-target">./l/drop.sql</prop> 

Это также генерируется как int8, а не numeric(11,0). Что можно сделать, чтобы решить эту проблему?

Ответы [ 2 ]

1 голос
/ 13 июля 2019

Действительно довольно сложно понять, чего вы пытаетесь достичь, но если я правильно понял:

  • вы хотите сохранить переносимость вашего приложения, не устанавливая определение столбца на уровне сущности равным NUMERIC(11,0), что делает его специфичным для Postgres
  • в то же время вы хотите, чтобы ваш столбец использовал NUMERIC(11,0) для Postgres , а не INT8, который Hibernate обычно использовал бы для Long в Postgres (и надеется найти в вашем схема после проверки)

Короче говоря, вам нужна индивидуальная настройка базы данных, которая не отражается в вашем сопоставлении сущностей. Единственный способ добиться этого - настроить диалект, который использует Hibernate для вашей версии Postgres. Что вам нужно сделать, это:

  1. определяет, какая версия диалекта выбирается для вашей базы данных Postgres (это будет одно из следующих: PostgresPlusDialect, PostgreSQL81Dialect, PostgreSQL82Dialect, PostgreSQL91Dialect, PostgreSQL92Dialect, PostgreSQL93Dialect, PostgreSQL94Dialect, PostgreSQL95Dialect, PostgreSQL9Dialect)

  2. расширить от этого класса, добавив следующее определение:

public MyCustomPostgresDialect() {
    super();
    registerColumnType(Types.BIGINT, "NUMERIC(11, 0)");
}

(Если вы хотите иметь возможность контролировать точность и масштаб, используя @Column(precision = ..., scale = ...), используйте registerColumnType(Types.BIGINT, "NUMERIC($p, $s)") вместо)

  1. добавьте свойство hibernate.dialect к persistence.xml, указывая на полное имя класса вашего пользовательского диалекта

Обратите внимание, что это, конечно, повлияет на все свойства Long в вашей модели данных, а не только на конкретное рассматриваемое поле.

0 голосов
/ 08 июля 2019

Я могу думать только об одной причине, потому что в вашем типе суммы сущности Long, но в сценарии создания JPA ваш DDL, заданный как amount numeric(11, 0), здесь второй параметр предлагает десятичную точность.Как вы можете видеть, java пытается ввести данные в типе Long (т. Е. 10.0000), аналогично BigInt в базе данных, но база данных не принимает такое десятичное значение типа numeric (11,0)

Вы должны быть в состоянии разрешитьэто либо путем изменения вашего Java-кода, чтобы иметь тип суммы сущности int, либо путем изменения DDL, чтобы иметь scaleInt.то есть.NUMERIC(11,5).Однако лучше всего будет иметь тип DECIMAL для любого нецелого типа.

enter image description here

http://www.h2database.com/html/datatypes.html#decimal_type

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