gpt4 book ai didi

java - 大对象不能在自动提交模式下使用

转载 作者:行者123 更新时间:2023-12-01 18:03:44 25 4
gpt4 key购买 nike

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

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

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

@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);
}

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

谢谢。

最佳答案

一个大对象可以存储在多个记录中,这就是您必须使用事务的原因。所有记录均正确或根本没有记录。

https://www.postgresql.org/docs/current/static/largeobjects.html

关于java - 大对象不能在自动提交模式下使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60592031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com