使用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 []工作正常。
- 使用java.sql.PreparedStatement将PDF文件上传到mysql BLOB而不会损坏
- Hibernate 4.2.2从未知长度的输入流创建blob
- 将Blob存储在Heroku(或类似的云服务)中
- Java文件上传到MySQL
- 播放测试对象Yaml的框架图像BLOB文件
- java.lang.AbstractMethodError:com.mysql.jdbc.PreparedStatement.setBlob(ILjava / io / InputStream;)V
- 从数据库中读取BLOB(PDF内容)并编辑和输出PDF编辑的文件,而无需创建物理文件
- 如何在java中将Blob转换为String和String转换为Blob
- MySQL blob到Netbeans JLabel