Бинарный массив Liquibase для нескольких типов баз данных

Я пытаюсь создать запись loadData в своей liquibase changeset, которую можно использовать как в базе данных MySQL, так и в базе данных H2 (для тестирования и разработки). Я использовал liquibase-maven-plugin и успешно создал CSV-файлы, содержащие записи для моей базы данных. Все BINARY(16) UUID для моей базы данных отображаются в моем CSV-файле следующим образом: "[B@2ba4b32b" -- который, как я предполагаю, является вызовом toString() для byte[]. Это отлично работает с Liquibase, вставляющим данные обратно в MySQL. Однако, когда я пытаюсь запустить то же самое на H2, я получаю следующую ошибку:

INSERT INTO PUBLIC.account (systemUuid, ...) VALUES ('[B@2ba4b32b', ...) -- ('[B@2ba4b32b', ...) [90003-187]
! org.h2.jdbc.JdbcSQLException: Hexadecimal string with odd number of characters: "[B@2ba4b32b"; SQL statement:
! INSERT INTO PUBLIC.account (systemUuid, ...) VALUES ('[B@2ba4b32b', ...) -- ('[B@2ba4b32b', ...) [90003-187]
! at org.h2.message.DbException.getJdbcSQLException(DbException.java:345) ~[h2-1.4.187.jar:1.4.187]
! at org.h2.message.DbException.get(DbException.java:179) ~[h2-1.4.187.jar:1.4.187]
! at org.h2.message.DbException.get(DbException.java:155) ~[h2-1.4.187.jar:1.4.187]
! at org.h2.util.StringUtils.convertHexToBytes(StringUtils.java:970) ~[h2-1.4.187.jar:1.4.187]
! at org.h2.value.Value.convertTo(Value.java:864) ~[h2-1.4.187.jar:1.4.187]
! at org.h2.table.Column.convert(Column.java:148) ~[h2-1.4.187.jar:1.4.187]
! at org.h2.command.dml.Insert.insertRows(Insert.java:143) ~[h2-1.4.187.jar:1.4.187]
! at org.h2.command.dml.Insert.update(Insert.java:114) ~[h2-1.4.187.jar:1.4.187]
! at org.h2.command.CommandContainer.update(CommandContainer.java:78) ~[h2-1.4.187.jar:1.4.187]
! at org.h2.command.Command.executeUpdate(Command.java:254) ~[h2-1.4.187.jar:1.4.187]
! at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:184) ~[h2-1.4.187.jar:1.4.187]
! at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:158) ~[h2-1.4.187.jar:1.4.187]
! at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:294) ~[liquibase-core-3.1.1.jar:na]
! at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:54) ~[liquibase-core-3.1.1.jar:na]
! ... 16 common frames omitted

Однако, если я преобразую двоичный массив в шестнадцатеричную строку, например "9a122c7c991a41c7bfcbf02586f97293", я получаю следующую ошибку при попытке импортировать данные в MySQL:

! com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'systemUuid' at row 1
! at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4185) ~[mysql-connector-java-5.1.25.jar:na]
! at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4119) ~[mysql-connector-java-5.1.25.jar:na]
! at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570) ~[mysql-connector-java-5.1.25.jar:na]
! at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731) ~[mysql-connector-java-5.1.25.jar:na]
! at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2809) ~[mysql-connector-java-5.1.25.jar:na]
! at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2758) ~[mysql-connector-java-5.1.25.jar:na]
! at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:894) ~[mysql-connector-java-5.1.25.jar:na]
! at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:732) ~[mysql-connector-java-5.1.25.jar:na]
! at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:294) ~[liquibase-core-3.1.1.jar:na]
! at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:54) ~[liquibase-core-3.1.1.jar:na]

Как я должен хранить двоичные массивы в наборе изменений Liquibase, чтобы и MySQL, и H2 могли их читать?


person voor    schedule 22.09.2015    source источник
comment
Ваша проблема в том, что ваш столбец в MySQL слишком короткий. Похоже, вы не используете H2, а MySQL при запуске теста.   -  person pmartin8    schedule 22.09.2015
comment
Так что, может быть, я неправильно генерирую UUID в шестнадцатеричном формате? Я пытаюсь использовать решение отсюда: GUID to ByteArray в сочетании с Hex.encodeHexString() в org.apache.commons.codec.binary.Hex   -  person voor    schedule 22.09.2015
comment
Независимо от того, как вы генерируете свой HEX, вы не нацелены на правильную БД, поэтому я бы рассмотрел эту проблему прежде всего...   -  person pmartin8    schedule 22.09.2015
comment
Я нацелен на две базы данных. Формат "[B@..." отлично работает в MySQL, но не в H2. Формат HEX отлично работает в H2, но не в MySQL.   -  person voor    schedule 22.09.2015
comment
В чем проблема с [B@... в H2?   -  person pmartin8    schedule 22.09.2015
comment
См. сообщение об ошибке выше, оно пытается интерпретировать его как шестнадцатеричную строку вместо двоичного массива.   -  person voor    schedule 23.09.2015


Ответы (1)


Вы можете установить разные значения в зависимости от базы данных в вашем скрипте liquibase.

<property name="myValue" value="[B@2ba4b32b" dbms="MySQL" />
<property name="myValue" value="9a122c7c991a41c7bfcbf02586f97293" dbms="H2" />

И затем вы можете использовать значение, используя ${myvalue} в любом месте скрипта.

person pmartin8    schedule 23.09.2015
comment
Эти значения отображаются в файлах CSV, и их сотни, хотя это может работать для 1 или 2 экземпляров, я действительно ищу более автоматизированное решение. - person voor; 23.09.2015
comment
Я знаю, что это обходной путь, но как насчет того, чтобы у вас было 2 CSV-файла, и вы загружали нужный в соответствии с СУБД? - person pmartin8; 23.09.2015