Проблема «SQLServerException: строка или двоичные данные будут усечены». Настроена ли база данных H2 для диагностики, но изменение размера столбца не вступило в силу? - PullRequest
0 голосов
/ 06 июня 2018

Что?

При исследовании проблемы SQLServerException: String or binary data would be truncated в приложении Java Spring Boot я настроил H2 в качестве альтернативы, чтобы предоставить мне более качественные диагностические сообщения об ошибках и большую гибкость при воссозданиисценарий.

TLDR? Перейти к И проблема в ...

Как вы настроили приложение Spring Boot?

Я настроил свое приложение Spring Boot на использование базы данных H2 вместо SQL Server следующим образом:

  1. Экспортировал схему из SQL Server и создал сценарий db/sql/test.sql для создания схемы и объектов в H2 - для краткости я сократил это значение до одного поля.

    CREATE SCHEMA IF NOT EXISTS "MYSCHEMA";
    
    CREATE TABLE "MYSCHEMA"."MyTable"
    (
        MyField nvarchar(1500)
    )
    
  2. Настроил зависимость maven для H2:

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.197</version>
        <scope>test</scope>
    </dependency>
    
  3. Сконфигурировал источник данных в application.yml для использования H2:

    spring:
      datasource:
        database: HSQL
        driverClassName: org.h2.Driver
        url: jdbc:h2:mem:MyDBName
        username: sa
        password:
    
  4. Создан тестовый класс конфигурации для определения вставляемого компонента источника данных взапустите скрипт создания схемы test.sql:

    @Configuration
    public class TestConfiguration {
        @Bean
        public DataSource dataSource() {
            EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
            EmbeddedDatabase db = builder
                .setType(EmbeddedDatabaseType.H2)
                .addScript("db/sql/test.sql")
                .setName("MyDBName")
                .build();
            return db;
        }
    }
    

Что произошло, когда вы запустили приложение, используя эту конфигурацию?

Настроив это, я запустил тестовый сценарий, и H2 немедленно дал мне имя поля, которое будет усечено вего сообщение об ошибке (спасибо H2!) вместе с данными, которые будут усечены (и его длина).

Помогло ли увеличение размера поля предотвратить ошибку?

ошибочный столбец имел размер 1500. После изменения размера поля в сценарии и в классе Hibernate Entity до 2000 ошибка усечения данных больше не возникала в моем тестовом примере.

ошибка усечения все еще возникает при восстановлении столбца до исходного размера?

Когда я изменил сценарий создания схемы H2, чтобы изменить размер столбца до исходного размера (1500), ошибка усечения не возникла,несмотря на размер данных> 1500.

И проблема в том ...?

Почему мое изменение размера столбца в test.sql не оказало никакого влияния?

Ответы [ 2 ]

0 голосов
/ 06 июня 2018
@Entity
@Table(name = "MyTable")
public class Table implements Serializable {
@Column(name = "MyField", columnDefinition = "TEXT")
    private String myField;
}
0 голосов
/ 06 июня 2018

Что происходит?

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

Как выглядит длина столбца сущности?

@Entity
@Table(name = "myTable", schema="mySchema")
public class myEntity {
    @Column(length=2000) private String myField;
}

Какие биты скрипта были нужны?

Единственная часть сценария db/sql/test.sql, необходимая для создания схемы.

CREATE SCHEMA IF NOT EXISTS "MYSCHEMA";

А как насчет таблиц и столбцов?

Все таблицы,столбцы и размеры столбцов затем автоматически генерировались из @Entity классов.

Что еще нужно знать?

Да, также полезно знать, что всеString вводит в Entity по умолчанию реализацию varchar(255), поэтому для любого поля, которое длиннее этого, вам нужно будет указать аннотацию @Column(size=...).

TL; DR?

Длина столбца в созданной базе данных была получена из моей @Column аннотацииа не из оператора CREATE TABLE скрипта .sql!

Приложение

С настроенным H2, я мог бы легко переключаться между использованием SQL Server или H2 для диагностикипроблемы при воспроизведении тестового случая.

Спасибо H2!

Сообщения об ошибках H2 сообщают мне, какие именно данные будут усечены и какой столбец был затронут, и какова длинафактических данных было.После определения столбца и данных я смог разобраться в коде, чтобы выяснить, откуда он взялся.

...