java - 在序列化之前实例化 LAZY 关系

标签 java jpa

我在 VStateBE 中有这样的东西:

@OneToMany(mappedBy = "vState", fetch = FetchType.LAZY)
private Set<VOptionBE> vOptions;

@Override
public Set<String> getSaList() {

    if (saList == null) {
        saList = new TreeSet<String>();
        for (final VOptionBE option : vOptions) {
            saList.add(normalizeSACode(option.getSa()));
        }
    }
    return saList;

在另一个类 VOptionBE 中我有:

@Id
@Column(name = "SA", length = 4)
private String sa;

@ManyToOne
@JoinColumn(name = "V_SHORT")
private VStateBE vState;

我收到以下错误:

Caused by: Exception [EclipseLink-7242] (Eclipse Persistence Services -  2.3.4.v20130626-0ab9c4c): org.eclipse.persistence.exceptions.ValidationException
Exception Description: An attempt was made to traverse a relationship using indirection that had a null Session.  This often occurs when an entity with an  uninstantiated LAZY relationship is serialized and that lazy relationship is traversed after serialization.  To avoid this issue, instantiate the LAZY relationship prior to serialization.

当它尝试从 getSaList() 方法读取时会发生这种情况。

最佳答案

我建议找出为什么会发生(反)序列化,因为这种类型的错误在常见用例中并不常见。最常见的解决方案是之前预加载所有数据。

无论如何,如果您想确保始终在序列化之前加载惰性数据,那么在 VStateBE 类上实现您自己的序列化方法以在之前加载惰性集合可能会有所帮助对象被序列化。就写你自己的writeObject方法,类似这样:

@Entity
public class VStateBE implements Serializable {
  @OneToMany(mappedBy = "vState", fetch = FetchType.LAZY)
  private Set<VOptionBE> vOptions;

  // add method like this:
  private void writeObject(ObjectOutputStream stream)
        throws IOException {
    vOptions.isEmpty(); // this will load lazy data in a portable way
    stream.defaultWriteObject(); // this will continue serializing your object in usual way
  }
}

关于java - 在序列化之前实例化 LAZY 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33506978/

相关文章:

java - 创建Bean时出错 - Java - Maven 3.5 - Spring 5 - Hibernate 5

java - 如何在表单、验证和ddl中重用fieldlength?

java - JPA 对所有者的多对多合并触发对连接表的删除

java - BLOB 和 CLOB 的 Hibernate 配置以同时支持 Oracle 和 Postgres

java - 在运行时减少 Java 中的最大堆栈大小

java - android md5加密与mysql或php不匹配?

java - 将数组的字符串输出到 java 中的 JTextArea

java - Swagger OpenAPI 模型与 JPA 实体之间的映射

java - javase项目中的Eclipselink问题

java - 使用 WebDriver/HtmlUnit 获取所有 HTTP 请求