无法创建具有可嵌入ID的新实体

时间:2018-09-25 14:45:36

标签: java spring spring-boot spring-data-jpa

我有一个实体

@Entity
public class EcranChamp {

@EmbeddedId
@AttributeOverrides({ @AttributeOverride(name = "id_ecran", column = @Column(name = 
    "ecran", nullable = false)),
@AttributeOverride(name = "id_champ", column = @Column(name = "champ", nullable = false)) })
EcranChampId id ;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_ecran")
Ecran ecran;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_champ")
Champ champ; 
//getters & setters 

@Embeddable
public class EcranChampId implements Serializable {

 @Column(name = "id_champ", nullable = false) 
  private Long id_champ; 
  @Column(name = "id_ecran", nullable = false)  
  private Long id_ecran; 

当我尝试添加新的EcranChamp

EcranChamp ec = new EcranChamp();
ec.setChamp(c);
ec.setEcran(e);

我遇到此错误

  

org.hibernate.id.IdentifierGenerationException:为以下类生成空ID:com.kepler.portailclient.domain.model.EcranChamp类       在org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107)〜[hibernate-core-5.2.17.Final.jar:5.2.17.Final]       在org.hibernate.jpa.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(JpaPersistEventListener.java:67)〜[hibernate-core-5.2.17.Final.jar:5.2.17.Final]       在org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:189)〜[hibernate-core-5.2.17.Final.jar:5.2.17.Final]       在org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:132)〜[hibernate-core-5.2.17.Final.jar:5.2.17.Final]       在org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:58)〜[hibernate-core-5.2.17.Final.jar:5.2.17.Final]       在org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:783)〜[hibernate-core-5.2.17.Final.jar:5.2.17.Final]       在org.hibernate.internal.SessionImpl.persist(SessionImpl.java:768)〜[hibernate-core-5.2.17.Final.jar:5.2.17.Final]       在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)〜[na:1.8.0_161]       在sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)〜[na:1.8.0_161]       在sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)〜[na:1.8.0_161]       在java.lang.reflect.Method.invoke(未知来源)〜[na:1.8.0_161]       在org.springframework.orm.jpa.ExtendedEntityManagerCreator $ ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:350)〜[spring-orm-5.0.8.RELEASE.jar:5.0.8.RELEASE]       在com.sun.proxy。$ Proxy453.persist(未知来源)〜[na:na]       在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)〜[na:1.8.0_161]       在sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)〜[na:1.8.0_161]       在sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)〜[na:1.8.0_161]       在java.lang.reflect.Method.invoke(未知来源)〜[na:1.8.0_161]       在org.springframework.orm.jpa.SharedEntityManagerCreator $ SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:305)〜[spring-orm-5.0.8.RELEASE.jar:5.0.8.RELEASE]       在com.sun.proxy。$ Proxy453.persist(未知来源)〜[na:na]       在org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:490)〜[spring-data-jpa-2.0.9.RELEASE.jar:2.0.9.RELEASE]       在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)〜[na:1.8.0_161]       在sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)〜[na:1.8.0_161]       在sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)〜[na:1.8.0_161]       在java.lang.reflect.Method.invoke(未知来源)〜[na:1.8.0_161]       在org.springframework.data.repository.core.support.RepositoryComposition $ RepositoryFragments.invoke(RepositoryComposition.java:377)〜[spring-data-commons-2.0.9.RELEASE.jar:2.0.9.RELEASE]       在org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:200)〜[spring-data-commons-2.0.9.RELEASE.jar:2.0.9.RELEASE]       在org.springframework.data.repository.core.support.RepositoryFactorySupport $ ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:629)〜[spring-data-commons-2.0.9.RELEASE.jar:2.0.9.RELEASE]       在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)〜[spring-aop-5.0.8.RELEASE.jar:5.0.8.RELEASE]       在org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:593)〜[spring-data-commons-2.0.9.RELEASE.jar:2.0.9.RELEASE]       在org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:578)〜[spring-data-commons-2.0.9.RELEASE.jar:2.0.9.RELEASE]       在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)〜[spring-aop-5.0.8.RELEASE.jar:5.0.8.RELEASE]       在org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:59)〜[spring-data-commons-2.0.9.RELEASE.jar:2.0.9.RELEASE]       在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)〜[spring-aop-5.0.8.RELEASE.jar:5.0.8.RELEASE]       在org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294)〜[spring-tx-5.0.8.RELEASE.jar:5.0.8.RELEASE]       在org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)〜[spring-tx-5.0.8.RELEASE.jar:5.0.8.RELEASE]       在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)〜[spring-aop-5.0.8.RELEASE.jar:5.0.8.RELEASE]       在org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)〜[spring-tx-5.0.8.RELEASE.jar:5.0.8.RELEASE]       在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)〜[spring-aop-5.0.8.RELEASE.jar:5.0.8.RELEASE]       在org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor $ CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:135)〜[spring-data-jpa-2.0.9.RELEASE.jar:2.0.9.RELEASE]       在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)〜[spring-aop-5.0.8.RELEASE.jar:5.0.8.RELEASE]       在org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)〜[spring-aop-5.0.8.RELEASE.jar:5.0.8.RELEASE]       在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)〜[spring-aop-5.0.8.RELEASE.jar:5.0.8.RELEASE]       在org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:61)〜[spring-data-commons-2.0.9.RELEASE.jar:2.0.9.RELEASE]       在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)〜[spring-aop-5.0.8.RELEASE.jar:5.0.8.RELEASE]       在org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)〜[spring-aop-5.0.8.RELEASE.jar:5.0.8.RELEASE]       在com.sun.proxy。$ Proxy457.save(未知来源)〜[na:na]       在com.kepler.portailclient.domain.service.GestionEcranServiceImp.ajouterChampEcran(GestionEcranServiceImp.java:64)〜[classes /:na]       在com.kepler.portailclient.interfaces.web.controller.administration.EcranController.ajouterChampEcran(EcranController.java:93)〜[classes /:na]       在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)〜[na:1.8.0_161]       在sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)〜[na:1.8.0_161]       在sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)〜[na:1.8.0_161]       在java.lang.reflect.Method.invoke(未知来源)〜[na:1.8.0_161]

1 个答案:

答案 0 :(得分:1)

尝试将Champ和Ecran放入可嵌入的ID

@Embeddable
public class EcranChampId implements Serializable {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id_champ")
    Champ champ; 

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id_ecran")
    Ecran ecran;
    //getters & setters 
}


EcranChamp ec = new EcranChamp();
EcranChampId  id = new EcranChampId();
id.setChamp(c);
id.setEcran(e);
ec.setId(id);

您必须在Ecran和Champ中使用@Id @GeneratedValue(strategy = GenerationType.IDENTITY)