簡體   English   中英

Hibernate在級聯所有保存時不生成子ID

[英]Hibernate not generating child id on cascade all save

家長班:

@Entity
@Table(name = "****")
@Audited
public class Ship
{
    @Id
    @Column(name = "id")
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid")
    private String              id;

    @OneToMany(mappedBy = "associatedShip", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<ShipLoadlineInformation>   loadlineInformation = new ArrayList<ShipLoadlineInformation>(0);

    .. with other fields constructors, getters and setters.
}

子班:

@Entity
@Table(name = "*********")
@Audited
public class ShipLoadlineInformation
{
    @Id
    @Column(name = "id")
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid")
    private String      id;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "ASSOCIATED_SHIP")
    private Ship        associatedShip;

    .. with other fields, constructors, getter and setters
}

我將其保存在我的DAO中,如下所示:

    this.sessionFactory.getCurrentSession().save(ship);

當我嘗試保存對象時,它會給我以下錯誤:

org.hibernate.NonUniqueObjectException:具有相同標識符值的另一個對象已與該會話相關聯:[com.tms.model.transportMode.ShipLoadlineInformation#]位於org.hibernate.engine.internal.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java: 618)〜[hibernate-core-4.3.11.Final.jar:4.3.11.Final] at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:301)〜[hibernate-core-4.3.11 .Final.jar:4.3.11.Final]位於org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:244)〜[hibernate-core-4.3.11.Final.jar:4.3.11.Final]在org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:109)〜[hibernate-core-4.3.11.Final.jar:4.3.11.Final]在org.hibernate.event.internal.DefaultSaveOrUpdateEventListener處。 onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)〜[休眠 -core-4.3.11.Final.jar:4.3.11.Final)位於org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:684)〜[hibernate-core-4.3.11.Final.jar:4.3。 11.Final]位於org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:676)〜[hibernate-core-4.3.11.Final.jar:4.3.11.Final]位於org.hibernate.engine.spi。 CascadingActions $ 5.cascade(CascadingActions.java:235)〜[hibernate-core-4.3.11.Final.jar:4.3.11.Final] at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:350) 〜[hibernate-core-4.3.11.Final.jar:4.3.11.Final]在org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:293)〜[hibernate-core-4.3.11.Final .jar:4.3.11.Final] at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:161)〜[hibernate-core-4.3.11.Final.jar:4.3.11.Final] at org .hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:379)〜[hibernate-core-4.3.11.Final.jar:4.3.11.Final] at org.hibernate.engine.internal.Cascade.cascadeCollection( Cascade.java:319)〜[冬眠 ate-core-4.3.11.Final.jar:4.3.11.Final] at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:296)〜[hibernate-core-4.3.11.Final.jar :4.3.11.Final] at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:161)〜[hibernate-core-4.3.11.Final.jar:4.3.11.Final] at org.hibernate .engine.internal.Cascade.cascade(Cascade.java:118)〜[hibernate-core-4.3.11.Final.jar:4.3.11.Final]

在調試它時,發現正在生成父類的ID。 但是未生成子類的ID。

我認為這是原因。 如果我錯了請糾正我。

任何幫助表示贊賞。

謝謝。

ShipLoadlineInformation實例包含在Ship.loadlineInformation集合中時,可能會發生此錯誤。 當您保存ship時,這種save動作被級聯到他們身上。

解決它的最簡單方法是合並船(因此也將層疊操作mergeloadlineInformation )。

因此,在您的DAO中替換:

this.sessionFactory.getCurrentSession().save(ship)

與:

ship = this.sessionFactory.getCurrentSession().merge(ship)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM