2017-08-22 10 views
0

の片側を保存するとき。私自身がフォルダを保存しようとすると、患者のIDコレクションのためにLazyInitializationExceptionがスローされます。LazyInitializationException私はIdの収集、およびフォルダのコレクションを持つクラスの患者を持っている関係

Patientクラスは次のようになります。

その後
@Entity 
@Table(name = "folder") 
public class Folder implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    private Long id; 

    @ManyToOne 
    @JoinColumn(name = "patient_id", referencedColumnName = "id") 
    private Patient patient; 

} 

私は、その後のことを行い、サービスクラスを持っているが、このようなフォルダを保存します。

@Entity 
@Table(name = "patient") 
public class Patient implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    private Long id; 

    @OneToMany(mappedBy = "patient", fetch = FetchType.LAZY, orphanRemoval = true, cascade = CascadeType.ALL) 
    private Set<Id> ids = new HashSet<Id>(); 

    @OneToMany(mappedBy = "patient", fetch = FetchType.LAZY, orphanRemoval = true, cascade = CascadeType.ALL) 
    private List<Folder> folders = new ArrayList<Folder>(); 

    ... 
} 

フォルダのクラスは次のようになります

@Override 
@Transactional 
public void importData(Data data) { 

    // do other things 
    Folder folder = new Folder(); 
    // initialize folder values 
    ... 
    folder.setPatient(patient); 
    folderDAO.save(folder); 
    ... 
} 

そして、それはとFolderDAOにフォルダを保存しようとしたとき:

getHibernateTemplate().saveOrUpdate(folder); 

それはスロー:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: es.mycompany.myapp.Patient.ids, could not initialize proxy - no Session 
    at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:587) 
+0

'FetchType.EAGER'に変更してください。 –

+0

これは有効な解決策ではありません。私はメモリを過負荷にしたくないので、患者にロードするたびに大量のデータが含まれているため、すべてのIDをロードしたくありません。 – diminuta

+0

'Hibernate.initialize(folder.getPatient()。getIds());'? –

答えて

0

問題は、あなたがセッションの外でするsaveOrUpdateしようとしているということです。 Hibernate.initializeは、saveOrUpdateより前に使用するPatientコレクションを初期化するか、手動で休止セッションを開き、トランザクションを行い、コミットしてリソースを閉じることができます。

次のように試してみてください:= ALL設定は、フォルダの実体が保存されるときに患者のリスト/セットを更新するために休止状態設定されている、患者リストが更新されるようにメモリにロードする必要がありますカスケードでhttps://www.mkyong.com/hibernate/hibernate-transaction-handle-example/

1

。 CASCADE = ALLを削除して、リストと患者クラスの更新セットを手動で管理することができます。

+0

私は、患者のフォルダコレクションのcascade = ALLは、Patientエンティティを保存するたびにフォルダコレクションが保存されることを意味していました。 – diminuta

関連する問題