2015-12-27 2 views
0

У меня есть класс, который не очень хорошо сериализуется для реляционной сущности. Таким образом, я хотел бы сохранить его, используя JPA как CLOB (я могу сериализовать его в String). Как мне это сделать с помощью JPA?Как сохранить поле JPA в качестве clob?

Пример Entity:

@Entity 
@Table(name = "MY_TABLE") 
public class Foo { 
    @Id 
    private Long id; 
    private String simpleString; 
    private Bar bar; 
} 

Bar класс, который я хотел бы сохранялось как CLOB внутри MY_TABLE.

+0

* Как * вы можете сериализовать его в строку? –

ответ

5

Вы можете аннотировать строку javax.persistence.Lob.

@Lob 
@Basic(fetch = FetchType.LAZY) 
private String simpleString; 

См Lob Javadoc:

Указывает, что постоянное свойство или поле должно быть сохранено в качестве крупного объекта к большому типу объектов базы данных при поддержке. Переносные приложения должны использовать аннотацию Lob при сопоставлении с типом Lob базы данных. Аннотацию Lob можно использовать в сочетании с аннотацией Basic или аннотацией ElementCollection, когда значение набора элементов имеет базовый тип. Lob может быть либо двоичным, либо символьным.

Тип Lob определяется исходя из типа постоянного поля или свойства и за исключением строковых и символьных типов по умолчанию для Blob.

Далее вы можете установить Bar поле для transient, так что это не сохранялось:

@Transient 
private Bar bar 

Затем в Bar добытчика, вы можете deserialise его при необходимости: безопасность

public Bar getBar() 
{ 
    if (this.bar == null) 
    { 
    this.bar = deserialise(this.simpleString); 
    } 

    return this.bar; 
} 

Thread остается в качестве упражнения для читателя.

Кроме того, вы также можете использовать @PrePersist для сериализации Bar в свою строчную форму, если вам нужно сделать это непосредственно перед сохранением.

Смежные вопросы