我有一个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
);
答案 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 []工作正常。