【发布时间】:2020-05-19 14:57:22
【问题描述】:
我有和 oracle 表是这样定义的:
MYCLASS_ID_PK (NUMBER(50,0)) |MYCLASS_UUID (VARCHAR2(50 BYTE)) |PAYLOAD (CLOB)
我有一个这样定义的 JPARepository:
public interface MyClassRepository extends JpaRepository<MyClass, Long> {
Optional<MyClass> findByUuid(UUID uuid);
}
我有一个这样定义的实体:
...
import java.sql.Clob;
...
@Entity
@Table(name = "foo_myclass")
@NoArgsConstructor
@Getter
@Setter
@NamedStoredProcedureQueries({
@NamedStoredProcedureQuery(
name = "create_myclass",
procedureName = "CREATE_MYCLASS",
parameters = {
@StoredProcedureParameter(mode = ParameterMode.IN, name = "myClassUuid", type = String.class),
@StoredProcedureParameter(mode = ParameterMode.IN, name = "payload", type = Clob.class),
@StoredProcedureParameter(mode = ParameterMode.OUT, name = "myClassId", type = Long.class)
})
})
public class MyClass {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "myclass_id_pk")
private Long id;
@NotNull
@Type(type = "uuid-char")
@Column(name = "myclass_uuid")
private UUID uuid;
@Lob
@Column(name = "payload")
private Clob payload;
}
我最初在我的 Entity 类中使用 String 将我的负载链接到 oracle CLOB。但是,我的字符串大小有点太大,无法由 JPA 和 Oracle 正确处理(通过单元测试确认),Clob 方法允许我解决这个特定问题。
我现在面临的问题是,我的 findByUuid(UUID uuid) 返回了 MyClass 的一个实例,其中我的有效负载已使用 oracle.sql.CLOB 而不是 org.hibernate 的实现进行了实例化。 engine.jdbc.ClobProxy 实现。
在某些时候,Clob 的 oracle 实现给我带来了麻烦,我想避免它。我还想使用休眠实现来获得类似于https://thoughts-on-java.org/mapping-blobs-and-clobs-with-hibernate-and-jpa/ 中描述的内容。
有谁知道我如何强制 findByUuid(UUID uuid) 的结果使用 Clob 的休眠实现而不是 oracle 实现?
【问题讨论】:
-
我认为您不能“避免”使用 JDBC 驱动程序的
Clob实现,Hibernate 必须依赖它来处理大数据。不过,您似乎遇到了 XY 问题。如果您能解释使用ClobProxy的目标 和CLOB的实际 问题,或许我们可以提出另一种解决方案 -
我的有效载荷真的很大。当我运行“create_myclass”过程时,我得到“StoredProcedureParameter ORA-06502: PL/SQL: numeric or value error”(较小的有效负载不会发生)。使用 Clob 而不是 String 解决了这个问题。至于 CLOB oracle 实现(这导致我的 findByUuid(UUID uuid) 方法出现问题),我有以下两个问题: *(次要)该类中的大部分内容已被弃用,因此我想避免它。 *(主要)来自 Oracle Clob 的 getAsciiStream() 方法不会以我期望的格式返回有效负载。来自 Hibernate 的那个。