2015-11-03 59 views
0

懒惰的关系,我有:实例化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

我推荐找出为什么(德)序列化发生,因为这种类型的错误不常见于常见用例。最常见的解决方案是之前预先加载所有数据。

无论如何,如果你想确保懒惰数据序列化之前总是加载,它可以帮助实现对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 
    } 
}