【发布时间】: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