java - BLOB 和 CLOB 的 Hibernate 配置以同时支持 Oracle 和 Postgres

标签 java oracle hibernate jpa postgresql-9.1

我们的项目需要同时支持 Oracle 和 Postgres Dbs。并且可能会有更多数据库添加到此列表中。因此,需要针对 BLOB 和 CLOB 数据类型进行与数据库无关的 Hibernate 配置。

虽然 Oracle 可以正常工作:

@Lob
@Column(name="column1")
private String str;

@Lob
@Column(name="column2")
private byte[] bytea;

Postgres 开始提示。

org.springframework.orm.hibernate4.HibernateJdbcException: JDBC exception on Hibernate data access: SQLException for SQL [insert into TABLE_NAME (TABLE_TYPE, TABLE_ID, TABLE_CONTENT_BIN, TABLE_CONTENT_CHAR) values (?, ?, ?, ?)]; SQL state [0A000]; error code [0]; could not insert: [com.project.EntityClass]; nested exception is org.hibernate.exception.GenericJDBCException: could not insert: [com.project.EntityClass]] Caused by: org.hibernate.exception.GenericJDBCException: could not insert: [com.project.EntityClass] at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3144) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3581) at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:104) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:465) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:351) at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350) at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56) at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1258) at org.springframework.orm.hibernate4.SpringSessionSynchronization.beforeCommit(SpringSessionSynchronization.java:104) ... 40 more Caused by: java.sql.SQLFeatureNotSupportedException: Method org.postgresql.jdbc4.Jdbc4PreparedStatement.setCharacterStream(int, Reader, long) is not yet implemented. at org.postgresql.Driver.notImplemented(Driver.java:670) at org.postgresql.jdbc4.AbstractJdbc4Statement.setCharacterStream(AbstractJdbc4Statement.java:116) at org.hibernate.type.descriptor.sql.ClobTypeDescriptor$4$1.doBind(ClobTypeDescriptor.java:124) at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:90) at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:286) at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:281) at org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:56) at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2857) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3121) ... 48 more

研究发现人们建议使用 @Type( type = "org.hibernate.type.StringClobType")@Type( type = "org.hibernate.type.二进制类型")。两者都是 Hibernate Annotations。但是,我们打算使用 JPA 注释,这将需要在运行时使用 Hibernate,这在我看来是不必要的。

所以我的问题是,是否有一种方法可以以非常通用的方式处理 BLOB 和 CLOB,这不需要我们为不同的 DB 分支代码,也不需要添加 Hibernate 特定的注释。此外,我们不使用 hibernate 来创建表。

Postgres 版本 - 9.4-1201-jdbc41

Oracle 版本 - 12.1.0.1

hibernate 版本 -4.3.10.Final

最佳答案

由于我没有从这里得到其他答案,所以我想我会发布我为解决问题所做的工作,这可能会对其他人有所帮助。

因为我们没有使用 Hibernate 创建表,所以我在某处读到 hibernate/jpa 可以在没有 @Lob 注释的情况下将字段转换为适当的类型。例如,对于 byte[] 类型的字段,将 postgres 转换为文本,将 oracle 转换为 BLOB。

尝试过并为 Postgres 和 Oracle 工作。 :)

关于java - BLOB 和 CLOB 的 Hibernate 配置以同时支持 Oracle 和 Postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38701073/

相关文章:

java - : "Win32 refresh daemon" 期间发生内部错误

java - org.hibernate.exception.JDBCConnectionException : Could not open connection when open a transcation

java - Hibernate 从 4.3.x 迁移到 5.x 方法 org.hibernate.cache.spi.GeneralDataRegion.get(Object key)

sql - Oracle 查询结果与企业管理器值不匹配

sql - 为什么 Oracle 不识别存储的生成列定义?

java - 在一个 session 期间提交多个事务会提高性能吗?

java - 函数不执行 do-while 循环...不返回 main?

java - 什么时候 AtomicInteger 优于同步?

java GUI分配数组值

sql-server - 将旧的 "+"Join 转换为 SQL Server 语法?