大对象可能无法在自动提交模式下使用

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

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

为了加载数据,我使用了MultipartFile瞬态属性,并在其设置程序中设置了要保留的信息(字节[],文件名,大小)。我要坚持的实体看起来像这样(我省略了其余的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

以上是 大对象可能无法在自动提交模式下使用 的全部内容, 来源链接: utcz.com/qa/411882.html

回到顶部