【发布时间】:2013-10-28 02:14:12
【问题描述】:
我遇到了线程休眠问题。 我有一个多对一关系,其中包含两个城市对象。 通过该线程,我的 trackDao 可能会获得许多 trackEntitys 来坚持女巫包括同一个城市(邮政编码是唯一的)。
trackDao 坚持第一个实体后,我得到一个“重复实体异常”。
是否可以通过注释进行配置以强制获取优先保存以获取现有的 childId 并恢复 parrent 持久化?
谢谢
感谢您的宝贵时间。
在尝试保存城市以从 db 获取可能已经存在的城市(具有相同的邮政编码)之前,我尝试手动获取。
现在,一次旅行包括两个城市。 一个城市女巫已经存储在数据库中(objectId!= null) 和另一个城市女巫必须坚持(objectId == null)
虽然休眠现在必须知道 city1 已经持久化,但只有 city2 必须在城市表中持久化,但我得到一个“重复实体异常”。 Hibernate 将再次存储现有的城市。 为了解决这个问题,我超越了 tripDao 的通用保存方法并处理了城市持久化手册。 -> 如果 city.getId() == null 则只保存城市。 所以我得到了一个未存储的旅行对象,女巫包括两个已经存储的城市。如果我尝试保留该行程对象,我会收到休眠消息
“持久化跟踪javax.persistence.PersistenceException时出错:org.hibernate.PersistentObjectException:分离的实体传递给持久化:de....CityEntity”
我相信我的某些配置完全错误。
请帮忙。
我不想覆盖保存方法并手动存储现实。在我看来,默认情况下必须有效吗?
@Entity
@Table(name = "tracks", uniqueConstraints = @UniqueConstraint(columnNames = { "city1_id", "city2_id" }))
@SessionScoped
public class TrackEntity extends BaseEntity {
private static final long serialVersionUID = 4696847902782174082L;
@ManyToOne(targetEntity = CityEntity.class, fetch = FetchType.EAGER, cascade = CascadeType.PERSIST, optional=false)
@JoinColumn(name="city1_id")
private CityEntity city1;
@ManyToOne(targetEntity = CityEntity.class, fetch = FetchType.EAGER, cascade = CascadeType.PERSIST, optional=false)
@JoinColumn(name="city2_id", referencedColumnName="id")
private CityEntity city2;
private Integer distance;
@Entity
@Table(name = "cities")
@SessionScoped
public class CityEntity extends BaseEntity {
private static final long serialVersionUID = 8823384603378561475L;
private String name;
@Column(unique=true)
private String zipcode;
private String latitude;
private String longitude;
【问题讨论】:
-
你能贴一些代码吗?您使用的是什么主键?
标签: java hibernate jpa duplicates unique