【问题标题】:JpaSystemException: attempted to assign id from null one-to-one propertyJpaSystemException:试图从空的一对一属性分配 id
【发布时间】:2014-10-24 03:36:17
【问题描述】:

我在 Spring 和 Hibernate 中使用 Play 框架,当我尝试将包含一对一关系的实体保存到另一个实体时出现以下错误

[play] Caused by: org.springframework.orm.jpa.JpaSystemException: attempted to assign id from null one-to-one property [org.famian.web.models.domains.StudyCriteria.ensatIdent]; nested exception is org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property [org.famian.web.models.domains.StudyCriteria.ensatIdent]
 [play]     at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:244) ~[spring-orm-4.0.7.RELEASE.jar:4.0.7.RELEASE]
 [play]     at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:155) ~[spring-orm-4.0.7.RELEASE.jar:4.0.7.RELEASE]
 [play]     at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:417) ~[spring-orm-4.0.7.RELEASE.jar:4.0.7.RELEASE]
 [play]     at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59) ~[spring-tx-4.0.7.RELEASE.jar:4.0.7.RELEASE]
 [play]     at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213) ~[spring-tx-4.0.7.RELEASE.jar:4.0.7.RELEASE]
 [play] Caused by: org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property [org.famian.web.models.domains.StudyCriteria.ensatIdent]
 [play]     at org.hibernate.id.ForeignGenerator.generate(ForeignGenerator.java:98) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
 [play]     at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:117) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
 [play]     at org.hibernate.jpa.event.internal.core.JpaMergeEventListener.saveWithGeneratedId(JpaMergeEventListener.java:73) ~[hibernate-entitymanager-4.3.6.Final.jar:4.3.6.Final]
 [play]     at org.hibernate.event.internal.DefaultMergeEventListener.saveTransientEntity(DefaultMergeEventListener.java:271) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
 [play]     at org.hibernate.event.internal.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:251) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]    

这两个实体共享一个共同的主键,下面是我的类

@Entity
public class EnsatIdent implements Serializable {
    @EmbeddedId
    private EnsatIdentPK id;

    @OneToOne(mappedBy = "ensatIdent", cascade = CascadeType.ALL)
    private StudyCriteria studyCriteria;
}

@Entity
public class StudyCriteria {
    @EmbeddedId
    private EnsatIdentPK id;

    @MapsId
    @JoinColumns({
        @JoinColumn(name = "center_id"),
        @JoinColumn(name = "ensat_id")
    })
    @OneToOne
    private EnsatIdent ensatIdent;
}

@Embeddable
public class EnsatIdentPK implements Serializable {
    @Column(name = "center_id", columnDefinition = "varchar(5)")
    private String centerId;

    @Column(name = "ensat_id", columnDefinition = "int(11)")
    private Integer ensatId;
}

我的服务类是一个名为 IdenService 的类,它扩展了 Spring PagingAndSortingRepository 类。当我保存时,我调用了

IdenService service.save(ensatIdent)

如果我在

上执行 System.out.println()

ensatIdent.getStudyCriteria()

它显示

StudyCriteria(id=EnsatIdentPK(centerId=GYMU, ensatId=3))

如果实体只包含Ident信息,它保存得很好,但是如果我在对象中添加studyCriteria,就会出现错误。我不明白发生了什么,请帮忙。

【问题讨论】:

    标签: spring hibernate playframework-2.0 one-to-one


    【解决方案1】:

    已解决,问题是因为 StudyCriteria 对象没有 EnsatIden 对象的引用。

    通过添加

    ensatIdent.getStudyCriteria().setEnsatIdent(ensatIdent);
    

    解决了错误

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-16
      • 2021-12-25
      • 2019-11-28
      • 1970-01-01
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      相关资源
      最近更新 更多