2017-04-21 36 views
0

親エンティティを削除するときに、(データベースから)関連する子エンティティも削除する必要があります。私は下に見られるように削除のカスケードを使用しようとしましたが、私は間違って何かをしているに違いありません。親エンティティの削除時に子エンティティが削除されない

親エンティティオブジェクトでremoveを呼び出すと、「エンティティはまだデータベース内の別の場所で参照されています」というエラーメッセージが表示されます。データベース内の他の場所でエンティティが参照されている唯一の場所は、以下の2つの表にあることを確認できます(データベースから子行を手動で削除すると、親のremove呼び出しが正常に機能します)。私はエンティティオブジェクトについて読んでいて、過去9時間の間にさまざまなことを試みてきました。私は間違って何をしていますか?ここで

は私の親テーブルである:ここで

@Entity 
@Table(name = "TURTLE_LOOKUP") 
public class TurtleLookup implements Serializable 
{ 

@Basic(optional = false) 
@Column(name = "TURTLEID") 
private int turtleid; 

@Basic(optional = false) 
@Column(name = "TURTLE") 
private String turtle; 

@OneToMany(mappedBy = "turtleType", cascade = CascadeType.REMOVE) 
List<TurtleReview> turtleReviews; 

... 
} 

は私の子テーブルです:/ UPDATE

@Entity 
@Table(name = "TURTLE_REVIEW") 
public class TurtleReview implements Serializable 
{ 

@Column(name = "TURTLE_REVIEW_ID") 
private int turtleReviewId; 

@Column(name = "TURTLE_YEAR") 
private int turtleYear; 

@ManyToOne(cascade = CascadeType.REMOVE, optional = false) 
@JoinColumn(name = "TURTLE_ID", referencedColumnName = "TURTLEID") 
private TurtleLookup turtleType; 

@Column(name = "IS_COMPLETE") 
private short isComplete; 

... 
} 

EDIT:

私はCascadeType.ALLにCascadeType.REMOVEを変更した場合は、親TurtleLookupエンティティオブジェクトを削除すると、TurtleReviewエンティティがデータベースから正常に削除されます。ただし、新しいTurtleReviewエンティティオブジェクトを作成するために以下の関数を呼び出すと、JPAは新しいTurtleLookupエンティティをデータベースに挿入しようとします。「EntryはすでにDB内にあります。Transaction Rollback」例外がスローされます。以下は、新しいTurtleReviewエンティティを作成するときに実行されるコードです。すべて、またはすべて削除 - 孤児

@OneToMany(mappedBy = "turtleType", cascade = CascadeType.REMOVE) 
List<TurtleReview> turtleReviews; 

... 
} 

答えて

0

トライ変更カスケード値@Cascade注釈休止状態で試してみてください:あなたの関係はあなたがoneToManyを持つことができないoneToOneある場合

@Cascade(value = CascadeType.ALL) 
@OneToOne(mappedBy = "turtleReview") // mappedBy name of TurtleRewiew object field in TurtleLookup entity class 
private TurtleLookup turtleType; 

をあなたはList<TurtleReview>を持つことはできません。あなたの関係がoneToManyであれば、あなたのエンティティは、例えば次のようになります。

@Entity 
@Table(name = "TURTLE_LOOKUP") 
public class TurtleLookup implements Serializable 
{ 

@Basic(optional = false) 
@Column(name = "TURTLEID") 
private int turtleid; 

@Basic(optional = false) 
@Column(name = "TURTLE") 
private String turtle; 

@OneToMany(mappedBy = "turtleType") // or add cascade = javax.persistence.CascadeType.ALL and remove @Cascade if you are not using hibernate 
@Cascade(value = CascadeType.ALL) 
List<TurtleReview> turtleReviews; 

... 
} 


@Entity 
@Table(name = "TURTLE_REVIEW") 
public class TurtleReview implements Serializable 
{ 

@Column(name = "TURTLE_REVIEW_ID") 
private int turtleReviewId; 

@Column(name = "TURTLE_YEAR") 
private int turtleYear; 

@ManyToOne 
@JoinColumn(name = "TURTLE_ID", referencedColumnName = "TURTLEID") 
private TurtleLookup turtleType; 

@Column(name = "IS_COMPLETE") 
private short isComplete; 

... 
} 
+0

両方をCascadeType.ALLに変更すると、子オブジェクトの削除が機能しますが、新しいTurtleReviewエントリの作成時に、「Entry already DB内に存在します」というエラーメッセージが表示されます。 JPA/Entityフレームワークが作成しているSQL文をデバッグすることで、そうでなければTURTLE_LOOKUP表に新しい行を挿入しようとしているのがわかります。 – Mitchell

+0

turtlereviewオブジェクトを保存している間にturtlelookupを作成しないようにするには、TurtlleReviewエンティティのturtletypeフィールドのカスケードを削除する必要があります。 – OTM

0

public void setDatasetReviewComplete(TurtleLookup turtle, Short year, boolean isComplete) 
{ 
TurtleReview turtleReview = getTurtleReview(turtle, year); 
if (turtleReview == null) 
{ 
turtleReview = new TurtleReview(); 
turtleReview.setTurtleYear(year) 
turtleReview.setTurtleType(new a.b.entity.TurtleLookup(turtle.getId(), turtle.getValue())); 
} 
turtleReview.setIsComplete(isComplete ? (short)1 : 0); 
entityManager.persist(turtleReview); 
} 
+0

私は分かりません。なぜ私は相手のOneToManyを持っていないのですか?List を持てないのはなぜですか? TurtleLookupは多くのTurtleReviewsを持つことができますが、TurtleReviewはTurtleLookupを1つしか持てません。 – Mitchell

+0

はい、OneToManyとList はTurtleLookup側にありますが、TurtleReview側にはManyToOne(oneToOneではなく)が必要です。つまり、TurtleLookupにはTurtleReviewsが多く、TurtleReviewにはTurtleLookupが1つあります。 – paun90

+0

意味があります。私はそれを変更しました。子エンティティを作成するときに、新しい親エンティティを作成しようとするJPAの問題がまだあります。 – Mitchell

0

ドメインモデル、質問に取り残されている部分に問題がある可能性があります。あなたはおそらく環状カスケードを持っていますか?カスケードのサークルがあり、その中にはCascadeType.REMOVEとCascadeType.PERSISTがあるものもあれば、Hibernate(他のJPA実装についてはわからないもの)はremove()メソッドを呼び出すと何もしません。エラーまたは例外メッセージなし。

関連する問題