2016-12-08 9 views
0

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); 

この結果項目の永続削除を実行できるかどうか、つまりremoveList<Instance>に呼び出しますか?

注:新しいInstanceオブジェクトを追加してリストを更新すると、正常に動作します。それは問題を引き起こしている除去だけです。

+0

(1)どのようにユーザーを得ていますか? 'persist()'が新しいオブジェクトの場合、エラーメッセージはあなたが 'user = em.merge(user);'を実行するべきだと言います。 (2)関係は 'mappedBy'と結びついていないので、意図したとおりの双方向ではなく、あなたのエンティティ間に実質的に2つの単方向関係があります。例えば。 '@OneToMany(...、mappedBy =" user ")'を 'User.applications'(他の関係でも同様)で実行します。 (3) 'Application'エンティティ階層に' @Inheritance'がありますか?(例えば、 'Application'のスーパークラスにありますか?) –

+0

@NikosParaskevopoulos:(1)ユーザーは、 'entityManager.getEntityManager()。createNamedQuery( "User.findByUUID"、User.class).setParameter( "UUID"、Id).getSingleResult() 'を呼び出すことによって取得されます。私は他の操作(追加、更新)を通常通り返されたオブジェクトに対して行うことができるので、これが問題であるとは思わない。 (2)私はそれを知らなかったし、それを調べる、ありがとう。しかし、私は新しいオブジェクトを追加してプロパティを通常どおりに更新できるので、これが問題を引き起こす可能性がありますか? (3)いいえ、 '@Inheritence'はありませんが、' User'、 'Application'と' Instance'は '@ MappedSuperclass'でアノテーションされた基底クラスを拡張します – w128

+0

私は明確な解決策はありませんが、 try/ask:この方法を取得したユーザはすでに永続化されているので、 'persist()'の代わりに 'merge()'しようとするべきです。トランザクションは開始されていますか?それはユーザーを取得する前に述べていますか? (2)問題に関連しているかどうかはわかりませんが、後で問題が発生する可能性があります。 –

答えて

0

私は、インスタンスを除去した後serverAplicationを持続すべきだと思う、ないユーザー:

// For some User's ServerApplication object: 
serverAplication.getInstances().remove(0); // Attempt to remove an item from DB. 
entityManager.persist(serverAplication); 
+0

あなたの答えをありがとう、しかしこれは動作しません - 同じエラーが発生します。私が 'user'を永続させているのは、ユーザーのプロパティ(名前など)の一部を条件付きで更新しているからです。 – w128

関連する問題