【问题标题】:Hibernate with long text column with Oracle and PostgreSQL使用 Oracle 和 PostgreSQL 的长文本列休眠
【发布时间】:2017-08-13 07:43:18
【问题描述】:

我正在尝试在 Spring Boot (1.4.4) 应用程序中使实体与 Oracle (11.2) 和 PostgreSQL(9.4) 一起使用。

我的实体包含一个长文本字段(超过 4000 个字符)。 Oracle中合适的数据类型是CLOB,PostgreSQL中对应的类型是TEXT。

我可以让它与 PostgreSQL 一起工作

@Column(name = "LONG_TEXT", columnDefinition="TEXT")
private String longText;

但是,由于 CLOB 需要 @Lob 注释,因此 Oracle 在休眠验证阶段会失败。

以下代码适用于 Oracle

@Lob
@Column(name = "LONG_TEXT")
private String longText;

但是这一次从 PostgreSQL 读取时失败,并出现以下异常:

PSQLException:大对象不能在自动提交模式下使用

Stack overflow suggests 在事务中执行查询。忽略在选择查询中调用事务的可疑要求,将 @Transactional 添加到查询方法没有帮助。

欢迎提出任何想法。

【问题讨论】:

  • 我认为除了创建一个具有相同 @Table 注释但在 @Lob 处不同的相同实体之外,没有其他解决方案,但要明确一点:您有两个持久性单元共享实体类型或在不同服务器上使用不同数据库的应用程序?
  • 你试过@Lob @Type(type="org.hibernate.type.StringClobType")吗? SO中的某处还有一个自定义的hibernate方言解决方法。
  • @coladict - 这是一款需要支持两个不同数据库的应用。关于创建不同的实体,有没有一种方法不会导致整个代码库发生变化?
  • @pozs - 我试过了。在 PostgreSQL 中对 Oracle 和相同的异常没有影响。
  • @Boris 啊,您可能需要org.hibernate.type.MaterializedClobType,因为StringClobType 可能已被弃用(取决于您的休眠版本)。

标签: java spring oracle postgresql hibernate


【解决方案1】:

我们得出的解决方案是采用@Lob 和@Transactional 方法。

主要问题在于 @Transactional 注释的放置,导致 PSQLException。一旦修复,我们就可以使用这两种类型的数据库。

【讨论】:

    猜你喜欢
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 2012-07-19
    • 2017-05-30
    • 2011-04-22
    • 1970-01-01
    相关资源
    最近更新 更多