休眠 - 如果不存在则保存子级

时间:2013-10-19 06:31:06

标签: java hibernate jpa duplicates unique

我有一个线程休眠问题。 我有一个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;

1 个答案:

答案 0 :(得分:0)

我认为赛道有两个相同的城市。订单有一个相同的问题 - > *产品。但这是一个错误的应用程序,其中订单不能有重复的产品。我不知道你的情况允许什么,但我建议你调查City类并寻找equals方法。如果Track类中有java.util.List来保存城市,那么该列表可能有两个相同对象的元素(==)。