ここで非常に奇妙な状況に遭遇しました。エンティティのセットを削除しようとすると、すぐに別のエンティティのセットを追加しようとすると、同じ要素を持つ場合と持たない場合がありますが、以下の例外が発生しているようです。スタック トレース全体はあまり意味がないため、必要ありません。
javax.persistence.EntityNotFoundException: deleted entity passed to persist [com.test.MyEntity#<null>]
自分自身をより明確にするために、より詳細な説明をさせてください。
これは私のエンティティです。
@Entity
@Table(name = "MY_ENTITY")
@SequenceGenerator(name = "my_enty_seq", sequenceName = "MY_ENTITY_SEQ")
public class MyEntity {
private long id;
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "my_enty_seq")
@Column(name = "ID", unique = true, nullable = false, precision = 12, scale = 0)
public long getId() {
return this.id;
}
// Other methods & variables which are not relevant here.
}
これがエンティティで遊ぶクラスです。
public class MyEntityServiceImpl implements MyEntityService {
public void updateMyEntities(List<MyEntity> newEntities) {
// Delete the Old Items
List<MyEntity> oldEntities = myDAO.getAllEntities();
myDAO.delete(oldEntities); // myDAO extends GenericDaoJpaWithoutJpaTemplate, hence, the DELETE is available in it.
// Add the New Items
myDAO.store(newEntities); // This is where I get the mentioned Exception.
}
// Other non-relevant stuffs
}
メソッドで前述の例外が発生するシナリオは、 oldEntitiesリストとnewEntitiesstore()
リストの両方に共通MyEntity
のオブジェクトがある場合です。
これを機能させるためにかなりのことを試しましたが、問題を克服するのに役立つものは何もありませんでした。FetchType.EAGER
&の追加CascaseType.ALL, CascaseType.PERSIST
も機能しませんでした。jpaEntityManager
にもメソッドがないようです。これは、メソッドの前後にcommit()
使用できます。私も( store 内部的に呼び出しますが)と交換してみました!delete()
store()
store()
persist()
persist()
注:-要素を比較して新しいリストのみを追加するのは面倒なので、古いリストを削除して新しいリストを挿入する必要があります (リストは時々かなり巨大になる可能性があります)。