【问题标题】:Force JpaRepository to return hibernate implementation of Clob instead of oracle implementation强制 JpaRepository 返回 Clob 的休眠实现而不是 oracle 实现
【发布时间】: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 的那个。

标签: java oracle hibernate jpa


【解决方案1】:

最后,我意识到我可以使用 oracle.sql.CLOB。我希望能够恢复 Clob 的休眠实现的原因之一是,在我的 findByUuid(UUID uuid) 之后,我对返回的 执行了一些操作MyClass 并尝试使用 JPARepository 保存方法将其保存在我的存储库中(这会导致失败,除非我将结果转换为 Clob 的 Hibernate 实现)。

我终于放弃了尝试恢复 Clob 的休眠实现。并简单地实现了一个自定义保存方法,如How to add custom method to Spring Data JPA(来自 kenny_k 的评论)中所示,我将返回的 oracle.sql.CLOB 转换为 org.hibernate.engine.jdbc 的实例。 ClobProxy 在调用 JPA 保存方法之前。

【讨论】:

猜你喜欢
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 2015-01-19
相关资源
最近更新 更多