我在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()方法读取时会发生这种情况。
答案 0 :(得分:0)
我建议找出WHY(de)序列化,因为这种类型的错误在常见用例中并不常见。最常见的解决方案是在之前预加载所有数据。
无论如何,如果你想确保在序列化之前总是加载延迟数据,那么在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
}
}