You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot部署Heroku后Postgres存储的byte[]格式图片无法显示问题

排查方向
  • 懒加载生效导致字段未读取:你给content字段配置了FetchType.LAZY懒加载策略,同时Controller层调用了getOne()方法获取实体,该方法默认返回JPA代理对象,若持久化上下文已关闭、且没有事务支撑,读取懒加载字段时会返回null或抛出LazyInitializationException,H2数据库对这类场景兼容性更强,所以本地不会触发问题。
  • Postgres的@Lob默认映射不匹配:Hibernate针对Postgres数据库,默认会将@Lob注解修饰的byte[]映射为OID大对象类型,而非存储二进制内容的bytea类型,OID类型的读取需要额外的事务上下文支撑,且对小体积图片的存储、读取效率更低。
  • 数据未正常持久化:上传逻辑执行时可能出现异常但未被捕获,导致content字段实际没有写入数据库,其余非Lob字段不受影响可以正常写入。
  • 权限限制:Heroku Postgres的角色权限可能禁用了大对象(OID)的读取权限,导致内容无法正常读取。
解决办法
  1. 替换实体查询方法
    将photoRepository.getOne(id)替换为photoRepository.findById(id).orElseThrow(),findById会直接从数据库加载完整实体,避免代理对象的懒加载问题。
  2. 调整Lob字段映射适配Postgres
    给content字段新增Hibernate类型注解,强制映射为bytea类型:
@Lob
@Basic(fetch = FetchType.LAZY)
@Type(type = "org.hibernate.type.BinaryType")
private byte[] content;

需要导入org.hibernate.annotations.Type依赖。
3. 补充事务支撑
给showPhoto方法添加@Transactional注解,保证读取懒加载字段时持久化上下文处于开启状态,可正常加载字段内容。
4. 直接查询Heroku Postgres验证数据
本地安装Heroku CLI后执行heroku pg:psql即可直接连接到线上数据库,执行SELECT id, length(content) FROM photo;即可确认content字段是否正常存入了二进制数据。
5. 查看线上日志定位具体错误
执行heroku logs --tail实时查看接口请求时抛出的异常类型,根据异常信息做针对性调整。

内容的提问来源于stack exchange,提问作者mortar-1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:48:05