我的课程没有很好地序列化到关系实体。因此,我希望使用JPA作为CLOB来保持它(我可以将它序列化为String)。我如何使用JPA?
示例实体:
@Entity
@Table(name = "MY_TABLE")
public class Foo {
@Id
private Long id;
private String simpleString;
private Bar bar;
}
Bar是我喜欢在MY_TABLE中作为CLOB持久化的类。
答案 0 :(得分:6)
您可以使用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
getter中,你可以根据需要对其进行反序列化:
public Bar getBar()
{
if (this.bar == null)
{
this.bar = deserialise(this.simpleString);
}
return this.bar;
}
线程安全留给读者练习。
此外,如果您需要在保留之前立即执行此操作,也可以使用@PrePersist
将Bar
序列化为其字符串形式。
答案 1 :(得分:0)
我遇到了与您类似的问题,我需要在字段中存储 JSON,因此当我使用 BLOB 时,我给自己带来了很多不必要的麻烦。 您正在将 blob 用于内容类型的数据,我恭敬地建议您将 CLOB 用于数据如果它是字符格式。
总结我的答案,如果您正在使用 ORACLE 数据库(这是一个总是会导致语言问题的数据库),请使用波纹管格式作为指南或基于 oracle 文档本身的最佳实践来解决您的问题:
@Lob @Basic(fetch=LAZY)
@Column(name="REPORT")
protected String report;
要检索数据或持久化数据,您可以使用 spring Crudrepository
并使用 save
和 findall
方法。
祝你好运!