Hibernate 将H2数据转换为PostgreSQL

Hibernate 将H2数据转换为PostgreSQL,hibernate,postgresql,h2,Hibernate,Postgresql,H2,我正在做从H2数据库到PostgreSQL的转换。我发现,在H2上执行SCRIPT TO command时创建的SQL转储包含几个不适当的构造: Unicode数据使用函数STRINGDECODE('Unicode-data')包装 二进制和Blob数据转义为X'Binary-data'-可能是十六进制格式(用于直接在数据库表中存储图像和文件) 我设法更改了导出的SQL,使其与Postgres兼容,如下所示: Unicode数据用E'Unicode-data'包装 二进制和Blob数据转义

我正在做从H2数据库到PostgreSQL的转换。我发现,在H2上执行SCRIPT TO command时创建的SQL转储包含几个不适当的构造:

  • Unicode数据使用函数STRINGDECODE('Unicode-data')包装
  • 二进制和Blob数据转义为X'Binary-data'-可能是十六进制格式(用于直接在数据库表中存储图像和文件)
我设法更改了导出的SQL,使其与Postgres兼容,如下所示:

  • Unicode数据用E'Unicode-data'包装
  • 二进制和Blob数据转义为E'\\X二进制数据',应在Postgres的“bytea”列中导入
数据的导入按应有的方式传递

我将Hibernate配置为使用PostgreSQL方言,其中Postgres的默认二进制和blob类型更改为“bytea”:

public class PostgreDialectFix extends PostgreSQLDialect {

    /**
     * Creates a new instance.
     */
    public PostgreDialectFix() {
        super();

        registerColumnType(Types.BLOB, "bytea");                    
        registerColumnType(Types.LONGVARBINARY, "bytea");           
    }
}
我还在persistense.xml中添加了以下内容:

<!-- PostgreSQL binary data usage ('false' for oid, 'true' for bytea) -->
<property name="hibernate.jdbc.use_streams_for_binary" value="true"/>
所以我的问题是: 这个转换出了什么问题?我认为这与导入数据或配置Hibernate以正确读取Postgres数据列有关

提前谢谢

其他信息:

以下是FILEDATA的Postgres数据库表定义:

CREATE TABLE filedata
(
  id bigint NOT NULL,
  version integer,
  created timestamp with time zone,
  createdbymemberid bigint,
  modified timestamp with time zone,
  modifiedbymemberid bigint,
  filedata bytea,
  file_id bigint,
)
WITH (
  OIDS=FALSE
);       
最终找到了解决方案:为了将文件数据从H2数据库导入PostgreSQL数据库,您需要使用PostgreSQL函数decode(文件数据以十六进制表示,'hex')。以下是导入示例:

INSERT INTO PUBLIC.FILEDATA(ID, VERSION, CREATED, CREATEDBYMEMBERID, MODIFIED, MODIFIEDBYMEMBERID, FILEDATA, FILE_ID) VALUES
(174849, 0, TIMESTAMP '2013-02-11 14:47:57.743', 174833, NULL, NULL, decode('89504e470d0a1a0a0000000d494844520000007b00000050080600000039ac0a8a00000c1a4944415478daed5d095494d7151e136bb3b659baa5494c62dbc4d85a4dba9ee6a49bd6b4f5246dd29ec6a5ae803126261aad5b5ca24489bb6ca2800a0ac822288280ca22b8a251510165515059040541d661bbbddf9b19986146f9c1f90707df77ce3bc30c33ef9f79dfbbefdefbdebdf7d790c47d038d1c0249b684245b42922d21c99690644b48b22524d912926c0949b684245be2be203bb9289b3cd213e9d3c3c1f49ffd...', 'hex'), 174848);

导入操作完成后,以bytea的形式正确插入到数据库中,您就可以正确加载它了!

使用PostgreSQL的函数decode()进行解析。答案和示例代码可以在上面的问题中找到:)

您能在脚本中搜索此值,然后发布失败的表定义和insert语句吗?这样就更容易看出问题所在。顺便说一下,有一些工具可以帮助迁移数据,例如-实际上有。谢谢Thomas!我用所需信息的样本更新了帖子。。顺便说一句,我尝试使用SquirrelDB复制插件,但由于要复制大量数据,所以没有成功。。因此,唯一的一个停止显示的是那些二进制列及其读数:)您确定已将Hibernate配置为使用您的特殊方言吗?
INSERT INTO PUBLIC.FILEDATA(ID, VERSION, CREATED, CREATEDBYMEMBERID, MODIFIED, MODIFIEDBYMEMBERID, FILEDATA, FILE_ID) VALUES
(174849, 0, TIMESTAMP '2013-02-11 14:47:57.743', 174833, NULL, NULL, decode('89504e470d0a1a0a0000000d494844520000007b00000050080600000039ac0a8a00000c1a4944415478daed5d095494d7151e136bb3b659baa5494c62dbc4d85a4dba9ee6a49bd6b4f5246dd29ec6a5ae803126261aad5b5ca24489bb6ca2800a0ac822288280ca22b8a251510165515059040541d661bbbddf9b19986146f9c1f90707df77ce3bc30c33ef9f79dfbbefdefbdebdf7d790c47d038d1c0249b684245b42922d21c99690644b48b22524d912926c0949b684245be2be203bb9289b3cd213e9d3c3c1f49ffd...', 'hex'), 174848);