[英]Hibernate not generating child id on cascade all save
Parent Class: 家长班:
@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.
}
Child class: 子班:
@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
}
I am saving it in my DAO as follows: 我将其保存在我的DAO中,如下所示:
this.sessionFactory.getCurrentSession().save(ship);
When i try to save the object ship its giving me following error: 当我尝试保存对象时,它会给我以下错误:
org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session : [com.tms.model.transportMode.ShipLoadlineInformation#] at 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] at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:244) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final] at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:109) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final] at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) ~[hibernate 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] at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:684) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final] at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:676) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final] at 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] at 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) ~[hibern -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] 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]
When debugging it, found out that the id for the parent class is getting generated. 在调试它时,发现正在生成父类的ID。 But the id for child class is not being generated. 但是未生成子类的ID。
I think this is the cause. 我认为这是原因。 Correct me if i am wrong. 如果我错了请纠正我。
Any help is appreciated. 任何帮助表示赞赏。
Thanks. 谢谢。
This error can occur when detached ShipLoadlineInformation
instances are contained in the Ship.loadlineInformation
collection. 当ShipLoadlineInformation
实例包含在Ship.loadlineInformation
集合中时,可能会发生此错误。 This way save
action is cascaded to them when you save ship
. 当您保存ship
时,这种save
动作被级联到他们身上。
The easiest way to get around it is to merge the ship (thus cascading merge
operation to loadlineInformation
as well). 解决它的最简单方法是合并船(因此也将层叠操作merge
到loadlineInformation
)。
So, in your DAO replace: 因此,在您的DAO中替换:
this.sessionFactory.getCurrentSession().save(ship)
with: 与:
ship = this.sessionFactory.getCurrentSession().merge(ship)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.