使用jpa从postgres读取byte 时,长度几乎翻倍

我有一个Image类,它有一个byte []来包含实际的图像数据。 我能够在我的webapp上上传和插入图像。 当我从JPA读取图像后尝试显示图像时,我的byte []的长度总是2x-1或2x-2,其中x是postgres 9中bytea字段的长度。显然浏览器不会显示图像说它已损坏。 我可以用一些帮助来弄清楚为什么我得到(大约)两倍的预期。 这是我的图像类的映射。 使用eclipselink和JPA 2在Mac上击中postgres 9。

当我从数据库中选择时

select *, length(bytes) from image; 

我的长度为9765.在我的控制器的断点中,byte []长度为19529,这比数据库中的两倍差。

 @Entity @Table( name = "image" ) @SequenceGenerator( name = "IMAGE_SEQ_GEN", sequenceName = "IMAGE_SEQUENCE" ) public class Image extends DataObjectAbstract { @Id @GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "IMAGE_SEQ_GEN" ) private Long key; @Column( name="content_type" ) private String contentType; @Lob @Basic( optional=false ) @Column( name="bytes" ) private byte[] bytes; // constructor and getters and setters } 

pgadmin向我展示了图像表的以下内容

 CREATE TABLE image ( "key" bigint NOT NULL, bytes bytea, content_type character varying(255), "version" integer, CONSTRAINT image_pkey PRIMARY KEY (key) ) WITH ( OIDS=FALSE ); 

在PostgreSQL中,使用hex编码将9字节[]发送到客户端。

如果这是错误的原因,您必须找到JPA的更新。 或者您可以更改数据库服务器的配置,但以前更好。

“bytea_output = escape”只是一种解决方法,Postgres 8.0将bytea编码更改为hex。

使用当前的JDBC驱动程序,因为9.0-dev800(9.0 Build 801当前是最新的),问题将得到解决。

GlassFish 3.x用户的补充答案 (原则可能适用于其他应用服务器)

您可能无意中使用了旧的PostgreSQL JDBC驱动程序。 您可以通过在某处注入DataSource (例如EJB)并在其上执行以下操作来测试:

System.out.println(ds.getConnection().getMetaData().getDriverVersion());

在我的情况下,由于我使用9.1驱动程序进行部署,因此它是出乎意料的8.3。

要找出它的来源:

System.out.println(Class.forName("org.postgresql.Driver").getProtectionDomain().getCodeSource().getLocation());

事实certificate,它出现在我的GlassFish域的lib目录中。 我不确定它是怎么到达的 – GlassFish肯定不会那样运送 – 所以我只是删除了它,问题就消失了。

尝试查看您获得的数据。 它可能会为您提供有关正在发生的事情的线索。

检查你是否有一个旧的postgresql jar。 我遇到了同样的问题,在我的lib中找到了8.3 postgresql jar和一个9.1 postgresql jar。 删除8.3 postgresql后,byte []工作正常。