【问题标题】:org.springframework.orm.jpa.JpaSystemException: null id generated for:class oneToOneorg.springframework.orm.jpa.JpaSystemException:为:class oneToOne 生成空 id
【发布时间】:2017-03-14 15:17:28
【问题描述】:

如题,当我尝试使用Spring Data jpa保存数据时出现以下异常。请帮我解决这个问题,因为我通过搜索熟悉的问题仍然无法解决。

课堂活动:

@Entity
@Table(name = "activity")
@Access(AccessType.FIELD)
public class Activity implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String activityName;
private String startTime;
private String endTime;

@OneToOne(fetch = FetchType.LAZY, mappedBy = "activity", cascade = CascadeType.ALL, optional = false)
private ActivityContent activityContent;


private Integer isDelete;

@PrePersist
public void prePersist() {
    isDelete = 0;
}
//setters and getters
}

类活动内容:

@Entity
@Table(name = "activity_content")
@Access(AccessType.FIELD)
public class ActivityContent implements Serializable {

    @GenericGenerator(name = "generator", strategy = "foreign", parameters = @Parameter(name = "property", value = "activity"))
    @Id
    @GeneratedValue(generator = "generator")
    @Column(name = "activity_id", unique = true, nullable = false)
    private Long activityId;

    @Column(columnDefinition = "TEXT")
    private String content;

    @OneToOne(fetch = FetchType.LAZY)
    @PrimaryKeyJoinColumn
    private Activity activity;
//setters and getters
}

道接口:

public interface ActivityDao extends PagingAndSortingRepository<Activity,Long>,JpaSpecificationExecutor<Activity>{
}

在调用activityDao.save(activity)之前,我已经按照其他博客所说的将以下属性设置为activity和activityContent,但是没有用。

activityContent.setActivity(activity);
activity.setActivityContent(activityContent);
activityDao.save(activity);

如果有人帮助我,将不胜感激。

异常详情:

org.springframework.orm.jpa.JpaSystemException: null id generated for:class com.gauldin.activity.orm.ActivityContent; nested exception is org.hibernate.id.IdentifierGenerationException: null id generated for:class com.gauldin.activity.orm.ActivityContent
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:333)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:244)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:488)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:133)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:57)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
at com.sun.proxy.$Proxy123.save(Unknown Source)

【问题讨论】:

    标签: java hibernate spring-data-jpa


    【解决方案1】:

    在您的 ActivityContent 中尝试使用:

    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @MapsId
    @JoinColumn(name = "activity_Id", referencedColumnName = "id")
    private Activity activity;
    

    当您组装时,您应该将 ActivityContent 保存为 OneToOne 的所有者:

    activityContent.setActivity(activity);
    activityContentDao.save(activityContent);
    

    如果您想保存 Activity,则必须将其设为拥有方。

    编辑

    同时尝试将生成器设置为:

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "activity_id", unique = true, nullable = false)
    private Long activityId;
    

    【讨论】:

    • 我尝试使用注解@MapId 和@JoinColumn(name = "activity_Id", referencedColumnName = "id"),但没有成功。我已将活动内容保存到活动中,以使活动拥有活动内容。就像这样,activity.setActivityContent(activityContent);对吗?
    • 还是报异常org.springframework.orm.jpa.JpaSystemException: null id generated for:class com.gauldin.activity.orm.ActivityContent;
    • 好的,我忘了添加 cascade = CascadeType.ALL.. 检查更新后的帖子
    • 像这样在 OneToOne 上添加它? @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) @MapsId @JoinColumn(name = "activity_Id", referencedColumnName = "id") 私人活动活动;还是不行...T.T
    • 你是这样保存的吗?活动内容.setActivity(活动); activityContentDao.save(activityContent);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    相关资源
    最近更新 更多