大对象不能用于自动提交模式

新手上路,请多包涵

我有一个在 PostgreSQL 数据库上使用 Hibernate 的 Spring 应用程序。我正在尝试将文件存储在数据库的表中。它似乎将行与文件一起存储(我只是在 EntityManager 上使用 persist 方法),但是当从数据库加载对象时,我得到以下异常:

 org.postgresql.util.PSQLException: Large Objects may not be used in auto-commit mode.

为了加载数据,我使用了 MultipartFile 瞬态属性,并在其设置器中设置了我想要保留的信息(字节 []、文件名、大小)。我坚持的实体看起来像这个(我省略了其余的 getters/setters):

 @Entity
@Table(name="myobjects")
public class MyClass {

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sequence")
    @SequenceGenerator(name="sequence", sequenceName="myobjects_pk_seq", allocationSize=1)
    @Column(name="id")
    private Integer id;

    @Lob
    private String description;

    @Temporal(TemporalType.TIMESTAMP)
    private Date creationDate;

    @Transient
    private MultipartFile multipartFile;

    @Lob
    @Basic(fetch=FetchType.LAZY, optional=true)
    byte[] file;

    String fileName;

    String fileContentType;

    Integer fileSize;

    public void setMultipartFile(MultipartFile multipartFile) {
        this.multipartFile = multipartFile;
        try {
            this.file = this.multipartFile.getBytes();
            this.fileName = this.multipartFile.getOriginalFilename();
            this.fileContentType = this.multipartFile.getContentType();
            this.fileSize = ((Long) this.multipartFile.getSize()).intValue();
        } catch (IOException e) {
            logger.error(e.getStackTrace());
        }
    }
}

我可以看到,当它持久存在时,我在行中有数据,但是当我调用此方法时,它失败了:

 public List<MyClass> findByDescription(String text) {
    Query query = getEntityManager().createQuery("from MyClass WHERE UPPER(description) like :query ORDER BY creationDate DESC");
    query.setParameter("query", "%" + text.toUpperCase() + "%");
    return query.getResultList();
}

只有当结果包含带有文件的对象时,此方法才会失败。我试图在我的 persistence.xml 中设置

<property name="hibernate.connection.autocommit" value="false" />

但这并不能解决问题。

一般来说,应用程序运行良好,它只在事务完成时提交数据,如果出现故障,它会执行回滚,所以我不明白为什么会这样。

任何想法?

谢谢。

更新

查看 Shekhar 给出的链接,建议将调用包含在事务中,因此我在事务中设置了服务调用并且它有效(我添加了@Transactional 注释)。

 @Transactional
public List<myClass> find(String text) {
    return myClassDAO.findByDescription(text);
}

问题是我不想保留任何数据,所以我不明白为什么它应该包含在事务中。当我只从数据库加载了一些数据时进行提交是否有意义?

谢谢。

原文由 Javi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 657
2 个回答

Instead of using @Transactional , all I did for this issue was to update this column in PostgreSQL DB from oid type to bytea type and added @Type 对于 @Lob 字段。

IE

 ALTER TABLE person DROP COLUMN image;
ALTER TABLE person ADD COLUMN image bytea;

并改变了

@Lob
private byte[] image;

@Lob
@Type(type = "org.hibernate.type.ImageType")
private byte[] image;

原文由 Philip John 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题