2017-12-01 7 views
0

私は非常に独特の何かについて知りました。私は注釈FetchType.EAGERがオブジェクトの削除を妨げるのはなぜですか?

@OneToMany(fetch = FetchType.EAGER, mappedBy = "account", cascade = CascadeType.ALL, orphanRemoval = true) 
List<LeaveQuery> leaveQueryList; 

@ManyToOne(fetch = FetchType.EAGER) 
@JoinColumn(name = "FK_account", nullable = true) 
private Account account; 

を使用するとき、私はもはや、データベースからLeaveQueryを削除することはできませんよ。いずれかの側でFetchType.EAGERをLAZYに変更すると正常に削除されますが、FetchType.EAGERを使用するには両側が必要です。

誰にもこの問題の回避策がありますか?

よろしく

EDIT:

HERESに私の削除コード:私は

Hibernateはそのオブジェクト場合は、子オブジェクトを削除しません、問題の原因を発見した

public ResponseEntity<?> delete(@PathVariable long custId) { 
    log.info("entering deleteleaverequest"); 
    LeaveQuery deleteLeaveQuery = leaveQueryRepository.findOne(custId); 
    log.info("condition" + deleteLeaveQuery.getStatus().equals("Onbehandeld")); 
    if (!deleteLeaveQuery.getStatus().equals("Onbehandeld")) 
     return ResponseEntity.badRequest().build(); 

    leaveQueryRepository.delete(deleteLeaveQuery); 
     accountService.sendLeaveRequestCanceledNotification(deleteLeaveQuery); 
    return ResponseEntity.ok().build(); 
} 
+0

あなたはどのように削除しますか?何かエラーを投げますか? p.s. eagerは非コレクションのデフォルトです – Zeromus

+0

何のエラーもありません。しかし、カスタム削除メソッドを作成すると、奇妙なTransastionrequiredエラーがスローされます。このスレッドでこれについて詳しく説明しました。 https://stackoverflow.com/questions/47549043/my-spring-jparepository-throws-a-transactionrequiredexception-when-im-trying-to/47549326#47549326しかし、jparepositoryの通常の組み込み削除機能を使用すると、任意のエラーをスローする – Maurice

+0

ええ、あなたが削除を行うコードの部分を入れて – Zeromus

答えて

0

親オブジェクトの子オブジェクトリストに残っています(私の場合はAccountですが、leaveQueryはleaveQuerylistの子オブジェクトです)。その親オブジェクトが依然としてwiの場合hibernateの永続コンテキストを細くします。だから私はこのコードを適用して私の問題を解決しました。

deleteLeaveQuery.getAccount().getLeaveQueryList().removeIf(a-> a.getId() == custId); 

アカウント内のLeaveQueryリストから削除したいleaveQueryを削除した後、正常に削除できました。

leaveQueryを削除する別の方法は、このleaveQueryに関連付けられたアカウントを取得してから、LeaveQueryListからleaveQueryを削除し、そのアカウントを保存することです。アカウントのOneToManyアノテーションにCascadeType.ALLがある場合、リストから削除されたリーブクエリがデータベースから自動的に削除されます。

関連する問題