作为标题,当我尝试使用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
}
Class ActivityContent:
@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
}
Dao界面:
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)
答案 0 :(得分:0)
在您的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);
如果您想要保存活动,那么您必须将其作为拥有方。
修改强>
还尝试将生成器设置为:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "activity_id", unique = true, nullable = false)
private Long activityId;