繁体   English   中英

休眠-如果不持久则保存子级

[英]Hibernate - Save Child if not persist

我有一个线程休眠问题。 我有一个与跟踪项包括多个城市对象的ManyToOne关系。 通过该线程,我的trackDao可能会获得许多trackEntity来持久化包含同一城市的邮政编码(邮政编码是唯一的)。

在trackDao坚持后,第一个实体我得到“重复实体例外”。

是否可以通过注释进行配置,以强制进行一次保存保存以获取现有的childId并继续保留父项?

谢谢


谢谢你的时间。

在尝试保存城市以从db获取可能已经存在的城市(具有相同的邮政编码)之前,我尝试了手动获取。

现在的行程包括两个城市。 一个城市女巫已经准备好存储在db中(objectId!= null),而另一个城市女巫必须持久化(objectId == null)

尽管休眠现在必须知道city1已经存在,但只有city2必须在city-table中保持存在,但是我得到了“重复实体异常”。 Hibernate将再次存储现有城市。 为了解决这个问题,我压倒了tripDao的通用保存方法,并处理了该城市维护手册。 ->如果city.getId()== null,则保存城市。 因此,我得到一个未存储的旅行对象,其中包括两个已经存储的城市。 如果我尝试保持该旅行对象,则会收到休眠消息

“持久化trackjavax.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;

我认为一条轨道有两个相同的城市。 我在订购-> *产品时遇到了同样的问题。 但这是应用程序中的错误,订单中不能有重复的产品。 我不知道您的情况允许什么,但建议您调查City类并寻找equals方法。 如果在Track类中具有java.util.List来容纳城市,则该列表可能有两个具有相同对象的元素(==)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM