![](/img/trans.png)
[英]JPA/Hibernate using shared id and cascade=all tries to save child before parent, causing foreign key violation
[英]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
動作被級聯到他們身上。
解決它的最簡單方法是合並船(因此也將層疊操作merge
到loadlineInformation
)。
因此,在您的DAO中替換:
this.sessionFactory.getCurrentSession().save(ship)
與:
ship = this.sessionFactory.getCurrentSession().merge(ship)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.