如何使用Hibernate将文件存储在PostgreSQL数据库中?

4

我是一个新手,刚开始接触Hibernate。我需要将文件存储在Postgres中,这一列的数据类型是bytea

我在网上寻找了与此情况相关的工作演示,但是我没有找到任何有用的信息。

Hibernate映射:

<property name="fileData" type="binary">
   <column name="fileData" not-null="true" />
</property>

POJO :


private byte[] fileData; public byte[] getFileData() { return fileData; } public void setFileData(byte[] fileData) { this.fileData = fileData; }

表格 :

    create table nmonData(id int, buildNumber int, path text, fileName text, fileData bytea);

错误信息 :

org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [fileData] in table [nmondata]; found [bytea (Types#BINARY)], but expecting [binary(255) (Types#VARBINARY)]
    at org.hibernate.tool.schema.internal.SchemaValidatorImpl.validateColumnType(SchemaValidatorImpl.java:105)
    at org.hibernate.tool.schema.internal.SchemaValidatorImpl.validateTable(SchemaValidatorImpl.java:92)
    at org.hibernate.tool.schema.internal.SchemaValidatorImpl.doValidation(SchemaValidatorImpl.java:50)
    at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:91)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:473)
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444)
    at com.psl.perf.hibernate.util.HibernateUtil.<clinit>(HibernateUtil.java:34)
    at com.psl.perf.DAO.NmonReportFileDaoImpl.save(NmonReportFileDaoImpl.java:15)
    at com.psl.perf.service.DataService.saveNmonCSV(DataService.java:249)
    at com.psl.perf.main.Main2.main(Main2.java:8)
Jan 22, 2016 12:26:18 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH10001008: Cleaning up connection pool [jdbc:postgresql://x.x.x.x:5432/perf]
Exception in thread "main" java.lang.NullPointerException
    at com.psl.perf.DAO.NmonReportFileDaoImpl.save(NmonReportFileDaoImpl.java:17)
    at com.psl.perf.service.DataService.saveNmonCSV(DataService.java:249)
    at com.psl.perf.main.Main2.main(Main2.java:8)

有人可以分享一个可用的演示或链接吗?

这对我有用 在hibernate配置文件中注释掉<property name="hbm2ddl.auto">validate</property>就可以解决问题,但现在我对于在Java中存储文件的列和成员变量的数据类型感到困惑。


在PG中,bytea映射到Java中的byte[]。我假设您想要存储文件内容而不是引用(位置)。声明与列对应的对象字段为byte[]。将文件转换为byte[]并将其设置为字段值。当保存对象时,文件内容将映射到bytea列。从数据库读取时,读取字节数组并从byte[]重构文件。 - uncaught_exception
@DavidSiro NmonReportFileDaoImpl.java 只是获取会话并保存对象,没有其他操作。您还想看代码吗? - Ketu
Hibernate 5.0.6,postgres 9.4 - Ketu
我认为这是由于在Hibernate配置中的验证<property name="hbm2ddl.auto">validate</property>。移除验证属性后,异常消失,并且文件被存储在数据库中。 - Ketu
@ShireResident,你能否建议一下在没有任何问题的情况下,<property name="hbm2ddl.auto">validate</property> 这个属性应该使用什么样的PostgreSQL数据类型和对应的Java类型? - Ketu
显示剩余6条评论
1个回答

3
我假定您需要将文件内容存储到PG bytea列中。

PostgreSQL数据定义语言(DDL)

CREATE TABLE data_object
(
  obj_id bigserial NOT NULL,
  obj_name character(30),
  obj_file bytea,
  CONSTRAINT data_object_pkey PRIMARY KEY (obj_id)
)

Java对象

@Entity
@Table (name = "data_object")
public class DataObject {

    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
    @Column(name = "obj_id")
    private Long id;

    @Column(name = "obj_name")
    private String name;

    @Column(name = "obj_file")
    private byte[] file;

    // getters, setters, hasCode, equals, toString

驱动程序代码
byte[] data = new byte[FILE_SIZE];
// read file contents into data
DataObject obj = new DataObject();
obj.setFile(data);
// save obj using your hibernate session

我正在使用Hibernate 4.3.7和PG 9.4.1。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接