【问题标题】:Saving byte[] with hibernate to postgreSQL使用休眠将字节 [] 保存到 postgreSQL
【发布时间】:2015-04-03 12:20:46
【问题描述】:

目前,在数据库中,我有下表 (PostgreSQL 9.2):

                        jackpot_image

     id       jackpot_id         mime_type        image_data
   serial      integer          varchar(32)         bytea

我有以下实体:

@Entity
@Table(name = "jackpot_image")
public class JackpotImage {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @Column(name="jackpot_id")
    private int jackpotId;

    @Column(name="mime_type")
    private String mimeType;

    @Column(name="image_data")
    private byte[] imageData;

    //GET, SET

}

并遵循 DAO:

public class JackpotImageDao {

    public JackpotImage selectImage(int imageId){
        String hql = "FROM JackpotImage WHERE id = :imageId";
        Query query = getSession().createQuery(hql);
        query.setInteger("imageId", imageId);
        return (JackpotImage) query.uniqueResult();
    }

    public void save(JackpotImage image){
        getSession().saveOrUpdate(image);
    }
}

问题是当我尝试保存然后检索图像时,我得到了不同的字节数组。

JackpotImage image;
JackpotImageDao imageDao;
//Getting image and ImageDAO
imageDao.save(image);
JackpotImage img = imageDao.selectImage(image.getId());

现在,image 的二进制数据与img 的二进制数据不同。为什么?我该如何解决这个问题?

【问题讨论】:

  • 你说image 的二进制数据与img 的二进制数据不同,但你没有说你是如何确定的,或者是什么区别是。请显示小图像的完整示例,或至少显示原始和结果的前一百字节和最后一百字节。编辑您的问题以执行此操作,然后在完成后在此处发表评论。
  • 另外,你的 PgJDBC 版本是什么,SELECT current_setting('bytea_output'); 查询的输出是什么?

标签: java hibernate postgresql


【解决方案1】:

将注释@Lob添加到字段imageData。

【讨论】:

  • 感谢您的回答。但是你不能把它扩大一点吗?例如,为什么我必须使用 @Lob 注释?
  • 因为你将table中的image_data列定义为bytea,即大数据类型。对于这种情况,字段 imageData 必须使用 @Lob 进行注释。看link
  • 我已经添加了注释,但它不起作用。我得到了ERROR: column "image_data" is of type bytea but expression is of type bigint
  • 现在我什至无法保存实体。
  • 这是不正确的 - 或者更确切地说,正如所写的那样,缺少使其误导的关键信息。如果您使用 @Lob 进行注释,Hibernate 将使用 PostgreSQL 的外联大对象存储 pg_largeobject,通过使用大对象 oid 的 by-reference 访问。这与用户想要的使用 bytea 数组 bytea完全不同,并且在数据库级别不兼容
猜你喜欢
  • 2017-10-19
  • 2021-09-22
  • 1970-01-01
  • 2011-12-16
  • 2017-06-02
  • 2011-09-29
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
相关资源
最近更新 更多