Подтвердить что ты не робот

Как создать Clob в JPA в агностической реализации

Я использую Ejb3 и JPA (на основе Hibernate и Oracle 10g на данный момент)

У меня есть объект, содержащий clob

@Entity
@Table(name = "My_TAB")
public class ExampleEntity implements java.io.Serializable {

    private Clob someText;

    public void setSomeText(Clob someText) {
        this.someText= someText;
    }

    @Column(name = "COLUMN_NAME")
    public Clob getSomeText() {
        return this.someText;
    }

Затем я хочу сохранить объект этого типа.

В настоящий момент я делаю следующее, которое работает отлично

ExampleEntity exampleEntity = new ExampleEntity();
exampleEntity.setSomeText(Hibernate.createClob(aStringValue));
someOtherDao.save(exampleEntity);

Однако это связывает мой код с Hibernate! Я специально избегал до сих пор расширений Hibernate и использовал только аннотации JPA. Код работает, потому что действительно Hibernate - это моя текущая реализация.

Есть ли какой-то JPA API, который позволяет мне создавать clob в общем виде? Поэтому, если позже я решит переключиться на Toplink/EclipseLink или что-то еще, мне не придется ничего менять?

4b9b3361

Ответ 1

Вот такой пример - спецификация JPA (§ 9.1.5)

@Column(name="DESC", 
columnDefinition="CLOB NOT NULL", 
table="EMP_DETAIL") 
@Lob 
public String getDescription() { return description; }

Я считаю это стандартным способом для CLOB.

Ответ 2

Я не уверен, что буду делать это снова, но в прошлом, когда мне нужно было ограничить мое приложение наиболее широко используемым подмножеством типов sql, я реализовал двоичные объекты, используя отдельную таблицу char и сохранил ее gzipped и base 64. Используя XML-сопоставление, это было примерно так:

<list name="encodedValue" lazy="true" table="TABLE" cascade="all-delete-orphan">
  <key column="TABLE_ID"/>
  <index column="SEQ"/>
  <element type="string" column="LINE" length="2000"/>
</list>

В коде метод getValue получил результаты getEncodedValue, объединил их все вместе, а затем расшифровал и разархивировал. В качестве оптимизации я помещал простой столбец значений в родительскую таблицу и использовал это, если он мог вписываться в символы 2000 и только при необходимости отправлялся в дочернюю таблицу.

Метод setValue gzipped и закодировал его и сохранил в простом столбце, если он подходит, иначе разделите его на дочерние записи. Это также дает вам ленивую загрузку, и если данные вписываются в один столбец, ему даже не нужно делать отдельный запрос.

Вероятно, излишнее, если вы знаете, что ваши базы данных будут поддерживать клобы, но в нашей ситуации неплохо справились.