我有一个应用程序必须根据环境与 Oracle 或嵌入式 H2 数据库一起运行。到目前为止,我使用的是 MySQL 数据库而不是嵌入式 H2 数据库,但决定迁移。
我使用 Hibernate 3.3.1GA(并且受到限制,因此无法更新)。使用 Oracle 和 MySQL 一切正常,但是当我尝试使用 H2 数据库时,它一直挂起。问题似乎是带有 BLOB(序列化 Java 对象)的列。即使表是空的,执行也会挂起。
SLF4J 输出(日志级别全部):
TableMetadata.java:org.hibernate.tool.hbm2ddl.TableMetadata:<init>:62 INFO table found: DATABASE.PUBLIC.JAVA_OBJECTS
org.hibernate.tool.hbm2ddl.TableMetadata:<init>:63 INFO columns: [id, last_update, markdeleted, class, object]
org.hibernate.connection.DriverManagerConnectionProvider:closeConnection:152 TRACE returning connection to pool, pool size: 1
此时程序似乎挂起。早期的日志输出看起来很正常,当这个表没有被使用(从 hibernate.cfg.xml 中删除)时,程序启动得很好。
hibernate.cfg.xml(摘录)
<property name="hibernate.connection.driver_class">org.h2.Driver</property>
<property name="hibernate.connection.url">jdbc:h2:file:database</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password"></property>
<property name="hibernate.default_schema">PUBLIC</property>
<property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
<property name="connection.pool_size">1</property>
<property name="current_session_context_class">thread</property>
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
表的创建字符串:
CREATE TABLE java_objects (
id int(11) NOT NULL AUTO_INCREMENT,
class varchar(255) NOT NULL,
object blob NOT NULL,
last_update timestamp AS CURRENT_TIMESTAMP,
markDeleted tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (id)
) ;
最后是实体 xml
<hibernate-mapping>
<class name="server.DataBean" table="java_objects">
<id name="id" column="id">
<generator class="native" />
</id>
<property name="type" column="class" />
<property name="object" not-null="true">
<column name="object" sql-type="BLOB" />
</property>
<property name="lastUpdate" column="last_update" type="timestamp" />
<property name="markDeleted" type="boolean" />
</class>
</hibernate-mapping>
有谁知道我做错了什么?h2 在处理 blob 时有什么不同的期望?