【问题标题】:Hibernate not generating child id on cascade all saveHibernate 没有在级联上生成子 ID 全部保存
【发布时间】:2016-05-21 01:44:16
【问题描述】:

父类:

@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] 在 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) ~[hibernate-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] 在 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] 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:161) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final] 在 org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:379) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final] 在 org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:319) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final] 在 org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:296) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final] 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:161) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final] 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:118) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]

调试时,发现正在生成父类的id。但是没有生成子类的 id。

我认为这就是原因。如果我错了,请纠正我。

感谢任何帮助。

谢谢。

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    当分离的ShipLoadlineInformation 实例包含在Ship.loadlineInformation 集合中时,可能会发生此错误。这样,当您保存 ship 时,save 操作会级联到它们。

    绕过它的最简单方法是合并船(因此也将merge 操作级联到loadlineInformation)。

    所以,在你的 DAO 中替换:

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

    与:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-20
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多