【问题标题】:How to storage a file into a Database as byte[] with Hibernate?如何使用 Hibernate 将文件作为字节 [] 存储到数据库中?
【发布时间】:2013-10-30 21:21:20
【问题描述】:

我想以byte[] 的形式将文件存储到数据库表中。现在我有一个关于使用Hibernatebyte[] 存储到postgres 数据库表中的问题。我的Entity 类中有这个实现:

@Column
private byte[] bytes;

在我的数据库表中,它显示了byte[] 的数据类型byte

现在我可以在此列中看到plaintext(在我的例子中是我想要存储在数据库中的文件名)。对于每个字节,它将在数据库列中重复文件的名称。但为什么?

是否需要另一个 Hibernate 注释?

感谢您的帮助!

问候 马尔维夫

【问题讨论】:

  • 一般来说,将文件放入数据库是一个坏主意。 (IMO,如果您需要以事务方式编写或更新文件,这只是一个好主意)

标签: java hibernate postgresql jpa


【解决方案1】:

您必须使用 @Lob 注释该字段。

注意:如果列是自动生成的,您可能会考虑使用附加注释来设置列定义(例如,对于 MYSQL):

@Column(columnDefinition="LONGBLOB")//or VARBINARY(128) if you need a smaller limit

【讨论】:

  • @Lob 不起作用。我收到异常“列是 bytea 类型,但表达式是 bigint 类型”
  • 请将整个堆栈跟踪与原始消息一起发布。如果它是自动生成的,您也可以考虑删除现有列。
  • 我必须更正我的答案!您的解决方案有效!你有什么想法,如果一列用lob注解​​,可以存储多少字节?
  • 这取决于您的表/数据库中的列类型。检查您的数据库的该列类型的规范。
【解决方案2】:
@Column(columnDefinition = "LONGBLOB")
private byte[] bytes;

【讨论】:

    【解决方案3】:

    Domain

        import javax.persistence.Lob;
        @Lob
        private byte[] image;
    

    Repository layer

       byte[] image = getImageAsBytes();
       domain.setImage(image);
       entityManager.save(domain);
    

    它应该有效,至少它对我们有效。没有什么特别的魔法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-27
      • 2012-05-27
      • 2016-03-05
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      相关资源
      最近更新 更多