0

次のエンティティを永続化しようとしています:

public class CommentEntity {

@Id

@ManyToOne(optional=false,cascade=CascadeType.REFRESH, targetEntity=UserEntity.class)
@JoinColumn(name="USERID",referencedColumnName="USERID")
private UserEntity userEntity;

@ManyToOne(optional=false,cascade=CascadeType.REFRESH, targetEntity=PostEntity.class)
@JoinColumn(name="POSTID",referencedColumnName="POSTID")
private PostEntity postEntity;

}

しかし、エラーが出ます:

同期中に、カスケード PERSIST とマークされていない関係を通じて新しいオブジェクトが見つかりました: entity.PostEntity@16afec。

PostEntity を永続化しようとすると、永続化されます。そのような例外はスローされません:

public class PostEntity {

@ManyToOne(optional = false, cascade = CascadeType.REFRESH, fetch = FetchType.LAZY, targetEntity = UserEntity.class)
@JoinColumn(name = "USERID", referencedColumnName = "USERID")
private UserEntity userEntity;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "postEntity", fetch = FetchType.LAZY)
private List<CommentEntity> commentEntityList;
}

なぜそれが起こっているのですか?UserEntity は次のとおりです。

public class UserEntity {

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "userEntity")
private List<PostEntity> postEntityList;

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "userEntity")
private List<CommentEntity> commentEntityList;
}

次のコードを使用して commentEntity を永続化しています。

entityManagerFactory = Persistence
                    .createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
            entityManager = entityManagerFactory.createEntityManager();
            entityTransaction = entityManager.getTransaction();
            entityTransaction.begin();
            entityManager.persist(commentEntity);
            entityTransaction.commit();
            entityManager.close();

何が原因なのか理解できませんか?そして、PostEntity が同じ状況で永続化されるのはなぜですか?

私はEclipseLinkを使用しています

4

1 に答える 1

2

永続化されていないエンティティを参照するuserEntityまたはpostEntity(または両方)を持つCommentEntityを永続化しようとするためです。em.persist(commentEntityのインスタンス)を呼び出しても、更新のみをカスケード接続したため、これらのエンティティは永続化されません。em.persistへの個別の呼び出しでこれらのエンティティを永続化する必要があります。

これで質問に答えられない場合は、エンティティを作成して永続化するコードを提供してください。

于 2012-05-13T16:42:07.873 に答える