Заставить JpaRepository возвращать реализацию Clob в спящем режиме вместо реализации oracle - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть и 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;

 }

Первоначально я использовал String в своем классе Entity для ссылки на свою полезную нагрузку на oracle CLOB. Тем не менее, мой размер строки слишком велик для правильной обработки (подтверждено модульным тестом) JPA и Oracle, подход Clob позволил мне решить эту конкретную проблему c.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что мой findByUuid (UUID uuid) возвращает экземпляр MyClass, в котором вместо моего полезного груза была реализована реализация oracle. sql .CLOB. реализации org.hibernate.engine.jdb c .ClobProxy.

В какой-то момент реализация Clob oracle вызывает у меня проблемы, и я бы хотел этого избежать. Я также хочу использовать реализацию hibernate, чтобы иметь что-то похожее на то, что описано в https://thoughts-on-java.org/mapping-blobs-and-clobs-with-hibernate-and-jpa/.

Кто-нибудь знает, как я могу заставить результат использования findByUuid (UUID uuid) использовать Реализация Clob в спящем режиме вместо реализации oracle?

1 Ответ

0 голосов
/ 04 февраля 2020

Наконец, я понял, что для меня нормально работать с oracle. sql .CLOB . Одна из причин, по которой я хотел иметь возможность восстановить спящую реализацию Clob , заключается в том, что после моего findByUuid (UUID uuid) я выполнял несколько операций с возвращенным MyClass и попытался сохранить его в моем хранилище, используя метод сохранения JPARepository (который привел к сбою, если я не преобразовал результат в реализацию Hibernate Clob ).

Я окончательно сдался пытается восстановить гибернацию Clob . И просто реализовал пользовательский метод сохранения, как показано в Как добавить пользовательский метод в Spring Data JPA (комментарий от kenny_k), где я преобразую возвращенные oracle. sql .CLOB до экземпляра org.hibernate.engine.jdb c .ClobProxy перед вызовом метода сохранения JPA.

...