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(假设这是您的实体的名称)。而且您告诉 Hibernate,每当您持久化一个 Bean 时,还必须在 Bean 的 zip 上调用 persist()。并且 bean 包含一个 zip,该 zip 的 ID 为已存在于数据库中的 zip。所以很明显,你得到了这个例外。

要么使用 merge() 而不是持久化,要么从会话中查找 zip,将检索到的持久化 zip 附加到 bean,然后持久化 bean。

级联 ManyToOne 关联有点奇怪。您有几个 bean 实例共享一个 zip,并且每当您修改一个 bean 时,都会为所有其他 bean 修改 zip。

于 2013-01-21T20:49:41.383 回答