簡體   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