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

时间:2011-05-30 23:14:17

标签: java postgresql jpa blob eclipselink

我有一个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<Long>
{
    @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
);

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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());

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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