简体   繁体   English

Hibernate在级联所有保存时不生成子ID

[英]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). 解决它的最简单方法是合并船(因此也将层叠操作mergeloadlineInformation )。

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.

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