0

これが私の豆です:

@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "cl_id")
private Long clId;

@JoinColumn(name = "zip_id", referencedColumnName = "zip_id")
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Zip zipId;
@JoinColumn(name = "city_id", referencedColumnName = "city_id")
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private City cityId;
@JoinColumn(name = "street_id", referencedColumnName = "street_id")
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Street streetId;

私の問題は、既存の郵便番号、都市、または通りを使用する新しいクライアントを挿入しようとすると、次のエラーが発生することです。

Exception in thread "AWT-EventQueue-0" javax.persistence.EntityExistsException: 
Exception Description: Cannot persist detached object [bean.Zip[zipId=17]]. 
Class> com.jresto.common.bean.Zip Primary Key> [17]
at  oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.persist(EntityManagerImpl.java:208)

CascadeType.MERGE部分は考慮されません。

4

1 に答える 1

0

新しい Bean を永続化しています (それがエンティティの名前であると仮定します)。そして、Bean を永続化するときはいつでも、Bean の zip で persist() も呼び出す必要があることを Hibernate に伝えました。また、Bean には、データベースに既に存在する zip の ID を持つ zip が含まれています。したがって、明らかに、この例外が発生します。

永続化の代わりに merge() を使用するか、セッションから zip を検索し、取得した永続的な zip を Bean にアタッチして、Bean を永続化します。

ManyToOne アソシエーションのカスケードは少し奇妙です。1 つの zip を共有する複数の Bean インスタンスがあり、Bean の 1 つを変更すると、他のすべての Bean の zip が変更されます。

于 2013-01-21T20:49:41.383 に答える