繁体   English   中英

如何将 JPA 字段保存为 clob?

[英]How to persist a JPA field as a clob?

我有一个不能很好地序列化为关系实体的类。 因此,我想使用 JPA 作为 CLOB 来保存它(我可以将它序列化为字符串)。 我将如何使用 JPA 执行此操作?

示例实体:

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

Bar 是我希望在 MY_TABLE 中作为 CLOB 保留的类。

您可以使用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;
}

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

此外,如果您需要在持久化之前立即执行此操作,您还可以使用@PrePersistBar序列化为其字符串形式。

我有一个像你一样的问题,我需要在一个字段中存储一个 JSON,所以当我使用 BLOB 时,我给自己带来了很多不必要的麻烦。 您将 blob 用于内容类型的数据,我谨建议将 CLOB 用于字符格式的数据。

总结一下我的答案,如果您使用的是ORACLE数据库(这是一个总是会导致说出其语言问题的数据库),请使用以下格式作为指南或最佳实践,它基于 oracle 文档本身,以解决您的问题:

@Lob @Basic(fetch=LAZY)
@Column(name="REPORT")
protected String report;

要检索数据或保留数据,您可以使用 spring Crudrepository 并使用savefindall方法。

祝你好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM