当前位置: 首页 > 面试题库 >

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

东方森
2023-03-14
问题内容

我有一个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



 类似资料:
  • 问题内容: 如标题所述,我在应用程序中使用了休眠刷新模式机制。因此,当我更改休眠持久对象中的任何数据时,它会自动反映在数据库中。我不要这个 因此,我找到了使用FlushMode的解决方案。 所以这是我的实际问题: 最好使用冲洗模式代替?和 文档中此声明的含义是什么? 有时在执行查询之前会刷新会话,以确保查询从不返回过时状态。 http://docs.jboss.org/hibernate/orm/

  • 问题内容: 如我的标题所述,我在应用程序中使用了hibernate刷新模式机制。因此,当我更改hibernate持久对象中的任何数据时,它会自动反映在数据库中。我不要这个 因此,我找到了使用FlushMode的解决方案。 所以这是我的实际问题: 最好使用冲洗模式代替?和 文档中此声明的含义是什么? 有时在执行查询之前会刷新会话,以确保查询从不返回过时状态。 http://docs.jboss.or

  • 我正在使用java和mysql,但我无法修复错误。当我将new Farm插入表时,我正面临这些错误...... Java语言sql。SQLException:当autocommit=true时无法调用commit 错误如下 Java语言sql。SQLException:当autocommit=true时无法调用commit _commandsSQLE_loopSQLException(SQLEpa

  • 我正在尝试在OS X Mojave上启用提交签名。 错误是: 我尝试的是: 工作正常(见下文),未安装或 安装了GPG密钥链并添加了一个新密钥(甚至添加了一个单独的仅限符号的子密钥whithin) 已安装 工作正常(为文件生成新的.asc文件,为纯文本输出文本) 我调查并尝试了各种选择的问题: gpg对数据签名失败致命:写入提交对象失败[Git 2.10.0] git错误-gpg对数据签名失败 我

  • 我试图创建一个客户端应用程序使用谷歌Web工具包。我已经下载了最新的工具,并尝试使用Eclipse作为我的开发环境。 选择“Run as”(右键单击项目)时可用的命令包括“GWT编译器”和“GWT开发模式”以及其他一些与Jetty相关的模式。我选择“GWT开发模式”并得到一个包含以下文本的页面: 我将bookmarklets放入书签栏,然后单击TestClient的链接。我得到一个包含以下内容的页

  • 问题内容: 通常,您可以执行Python脚本,例如:,但是如果您处于交互模式,那么如何在文件系统上执行Python脚本呢? 应该可以多次执行该脚本。 问题答案: 使用的execfile(“script.py”),但只对蟒蛇2.x的工作,如果你使用的是3.0试试这个