Hibernateを初めて使用しているため、エンティティのList
からアイテムを削除しようとしたときに「」 。 orphanRemoval=true
を追加し、さまざまな組み合わせでカスケードタイプをMERGE
および/またはDELETE
に変更しようとしましたが、これは役に立ちませんでした。私のエンティティは以下のとおりです。トランザクション内コレクションからアイテムを削除しようとしたときに例外を渡した分離されたエンティティ
@Entity
public class User
{
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) // adding "orphanRemoval = true" doesn't help
@JsonManagedReference
private List<Application> applications;
}
@Entity
public class Application
{
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) // adding "orphanRemoval = true" doesn't help
@JsonBackReference
private User user;
}
@Entity
public class ServerApplication extends Application
{
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) // adding "orphanRemoval = true" doesn't help
@JsonManagedReference
private List<Instance> instances;
}
@Entity
public class Instance
{
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) // adding "orphanRemoval = true" doesn't help
@JsonBackReference
private ServerApplication server;
}
、私は効果的に次の操作を行います試してください:私が正しくするプロパティに注釈を付けることができますどのように
org.hibernate.PersistentObjectException: detached entity passed to persist: my.project.User
:中
// For some User's ServerApplication object:
serverAplication.getInstances().remove(0); // Attempt to remove an item from DB.
entityManager.persist(user);
この結果項目の永続削除を実行できるかどうか、つまりremove
をList<Instance>
に呼び出しますか?
注:新しいInstance
オブジェクトを追加してリストを更新すると、正常に動作します。それは問題を引き起こしている除去だけです。
(1)どのようにユーザーを得ていますか? 'persist()'が新しいオブジェクトの場合、エラーメッセージはあなたが 'user = em.merge(user);'を実行するべきだと言います。 (2)関係は 'mappedBy'と結びついていないので、意図したとおりの双方向ではなく、あなたのエンティティ間に実質的に2つの単方向関係があります。例えば。 '@OneToMany(...、mappedBy =" user ")'を 'User.applications'(他の関係でも同様)で実行します。 (3) 'Application'エンティティ階層に' @Inheritance'がありますか?(例えば、 'Application'のスーパークラスにありますか?) –
@NikosParaskevopoulos:(1)ユーザーは、 'entityManager.getEntityManager()。createNamedQuery( "User.findByUUID"、User.class).setParameter( "UUID"、Id).getSingleResult() 'を呼び出すことによって取得されます。私は他の操作(追加、更新)を通常通り返されたオブジェクトに対して行うことができるので、これが問題であるとは思わない。 (2)私はそれを知らなかったし、それを調べる、ありがとう。しかし、私は新しいオブジェクトを追加してプロパティを通常どおりに更新できるので、これが問題を引き起こす可能性がありますか? (3)いいえ、 '@Inheritence'はありませんが、' User'、 'Application'と' Instance'は '@ MappedSuperclass'でアノテーションされた基底クラスを拡張します – w128
私は明確な解決策はありませんが、 try/ask:この方法を取得したユーザはすでに永続化されているので、 'persist()'の代わりに 'merge()'しようとするべきです。トランザクションは開始されていますか?それはユーザーを取得する前に述べていますか? (2)問題に関連しているかどうかはわかりませんが、後で問題が発生する可能性があります。 –