如何解决用jpa从postgres读取byte []时,其长度几乎增加一倍
|| 我有一个Image类,它具有一个byte []来包含实际的图像数据。我可以上传图像并将其插入到我的Web应用程序中。当我尝试从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
);
解决方法
在PostgreSQL中,使用16进制编码将byte []发送到客户端。
如果这是错误的原因,则必须查找JPA的更新。
或者您可以更改数据库服务器的配置,但是以前的版本更好。
, \“ bytea_output = escape \”只是一种解决方法,Postgres 8.0将bytea编码更改为十六进制。
由于9.0-dev800(当前9.0 Build 801是最新的),因此请使用当前的JDBC驱动程序,并将解决此问题。
, GlassFish 3.x用户的补充答案(原理可能适用于其他应用服务器)
您可能无意中使用了旧的PostgreSQL JDBC驱动程序。您可以通过在某个地方(例如EJB)注入“ 3”并对其执行以下操作来进行测试:
System.out.println(ds.getConnection().getMetaData().getDriverVersion());
就我而言,这是8.3,这是意外的,因为我正在部署9.1驱动程序。
要找出这是从哪里来的:
System.out.println(Class.forName(\"org.postgresql.Driver\").getProtectionDomain().getCodeSource().getLocation());
事实证明,它位于我的GlassFish域的lib目录中。我不确定它是如何到达的-GlassFish当然不是那样发送的-所以我只是将其卸下,问题就消失了。
, 尝试查看您获得的数据。它可以为您提供有关发生情况的线索。
, 检查您是否有旧的postgresql jar。我遇到了同样的问题,并在我的lib中找到了8.3 postgresql jar和9.1 postgresql jar。删除8.3 postgresql后,byte []可以正常工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。