2015-12-27 36 views
0

我有一个不能很好地序列化到关系实体的类。因此,我想使用JPA作为CLOB来持久化它(我可以将它序列化为一个字符串)。我如何使用JPA来做到这一点?如何坚持一个JPA字段作为clob?

例实体:

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

酒吧,我想坚持作为内MY_TABLE一个CLOB类。

+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; 
} 

线程安全留给读者作为练习。

此外,如果您需要在保留之前立即执行此操作,您还可以使用@PrePersistBar串连到其字符串形式。