我有一个线程休眠问题。 我有一个ManyToOne关系,轨道包含两个城市对象。 通过该主题,我的trackDao可能会获得许多trackEntity来保持包含同一城市的女巫(邮政编码是唯一的)。
在trackDao持续存在第一个实体后,我得到了一个“重复的实体例外”。
是否可以通过注释配置强制get bevore save来获取现有的childId并恢复parrent持久化?
THX
你的时间。
在尝试保存城市以从db获取可能已存在的城市(具有相同的邮政编码)之前,我尝试手动获取。
现在旅行包括两个城市。 一个城市女巫已经存储在db(objectId!= null) 另一个城市女巫必须坚持下去(objectId == null)
虽然hibernate现在必须知道city1已经存在,但是只有city2必须在city-table中持续存在才能获得“重复实体异常”。 Hibernate将再次存储现有城市。 为了解决这个问题,我过度使用了tripDao的通用保存方法并处理了城市持久性手册。 - >如果city.getId()== null,只需保存城市。 所以我得到一个未存储的旅行对象,其中包括两个已存储的城市。如果我试图坚持那个旅行对象我得到了休眠消息
“持久化时出错trackjavax.persistence.PersistenceException:org.hibernate.PersistentObjectException:传递给persist的分离实体:de .... CityEntity”
我相信我的配置错误。
请帮助。
我不想过度使用save方法和manualy存储realations。在我看来,默认情况下必须工作吗?
@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;
答案 0 :(得分:0)
我认为赛道有两个相同的城市。订单有一个相同的问题 - > *产品。但这是一个错误的应用程序,其中订单不能有重复的产品。我不知道你的情况允许什么,但我建议你调查City类并寻找equals方法。如果Track类中有java.util.List来保存城市,那么该列表可能有两个相同对象的元素(==)。