Ответ 1
Вот такой пример - спецификация JPA (§ 9.1.5)
@Column(name="DESC",
columnDefinition="CLOB NOT NULL",
table="EMP_DETAIL")
@Lob
public String getDescription() { return description; }
Я считаю это стандартным способом для CLOB.
Я использую 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 или что-то еще, мне не придется ничего менять?
Вот такой пример - спецификация JPA (§ 9.1.5)
@Column(name="DESC",
columnDefinition="CLOB NOT NULL",
table="EMP_DETAIL")
@Lob
public String getDescription() { return description; }
Я считаю это стандартным способом для CLOB.
Я не уверен, что буду делать это снова, но в прошлом, когда мне нужно было ограничить мое приложение наиболее широко используемым подмножеством типов 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 и закодировал его и сохранил в простом столбце, если он подходит, иначе разделите его на дочерние записи. Это также дает вам ленивую загрузку, и если данные вписываются в один столбец, ему даже не нужно делать отдельный запрос.
Вероятно, излишнее, если вы знаете, что ваши базы данных будут поддерживать клобы, но в нашей ситуации неплохо справились.