将pdf上传到Postgres的问题
Posted
技术标签:
【中文标题】将pdf上传到Postgres的问题【英文标题】:Issue with uploading pdf into Postgres 【发布时间】:2019-06-28 11:34:43 【问题描述】:我正在尝试使用 Hibernate 将 pdf 文档保存到我的 postgres 10.1 数据库中。 下面是我的实体类。
@Entity
@Table(name = "FILEUPLOADS", schema="SomeSchema")
public class FileUploads
//skipping other columns
@Lob
@Column(name="DOCDATA")
private byte[] docData;
此列是postgres数据库中的op类型bytea。
正如 Authur 在这里所建议的:similar issue,我创建了我的 postgres 方言的自定义实现,如下所示。
@Configuration
public class TestDialect extends PostgreSQLDialect
public TestDialect()
super();
registerColumnType(Types.BLOB, "bytea");
然后在我的 persistence.xml 文件中,我正在使用这种自定义方言
<property name="hibernate.dialect" value="com.digital.repository.TestDialect" />
即使做了所有这些,我仍然遇到错误
ERROR: column "DOCDATA" is of type bytea but expression is of type bigint
Hint: You will need to rewrite or cast the expression.
Position: 251
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2468)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2211)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:309)
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:446)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:370)
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:149)
at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:124)
at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
... 250 more
为了解决这个问题,我还需要做什么?
【问题讨论】:
别这样。使用专为此目的设计的数据库保存您的大二进制文件:文件系统。然后将文件名保存在您的数据库中。 @JonathonReinhart 你将如何处理事务? @Simon 不需要。确保该文件存在于磁盘上,然后插入到数据库中。删除时颠倒顺序。如果查询总是从数据库开始,你将永远看不到没有后备文件的记录。 【参考方案1】:尝试改变休眠类型:
@Entity
@Table(name = "FILEUPLOADS", schema="SomeSchema")
public class FileUploads
//skipping other columns
@Type(type = "org.hibernate.type.BinaryType")
@Column(name="DOCDATA")
private byte[] docData;
【讨论】:
甲骨文???你说的是PostgreSQL! Oracle 有 BLOB 数据类型,你必须使用 @LOB 注释 再一次,我必须为 oracle 和 postgres 维护单一代码库 :-) 无论如何我都会尝试这个。谢谢!【参考方案2】:以下配置对我有用,我现在可以将 doc/pdf 保存到数据库中。
@Configuration
public class CustomPostgresDialect extends PostgreSQL82Dialect
@Override
public SqlTypeDescriptor remapSqlTypeDescriptor(SqlTypeDescriptor sqlTypeDescriptor)
if (sqlTypeDescriptor.getSqlType() == java.sql.Types.BLOB)
return BinaryTypeDescriptor.INSTANCE;
return super.remapSqlTypeDescriptor(sqlTypeDescriptor);
休眠 4.1.10
Java 1.7
【讨论】:
以上是关于将pdf上传到Postgres的问题的主要内容,如果未能解决你的问题,请参考以下文章
从 Postgres 返回图像 url 到前端 - Node / React
如何将存储在 Postgres 中的图像的图像 URL 插入 Spring Boot 模型
如何有效地将 Postgres 数据从 Query 传输到 S3