Java 使用JPA映射复合主键和外键

Java 使用JPA映射复合主键和外键,java,hibernate,jpa,Java,Hibernate,Jpa,我有两个表:A和B。它们都有一个复合主键。表B的PK也是表a主键的外键 当我尝试获取映射表B的类的实例时,会出现以下异常: org.hibernate.TypeMismatchException 该应用程序是一个Spring引导应用程序。 源代码可在 表B的代码源为: @Entity @Table(name="usuarios") public class UsuarioEntity implements Serializable { private static final long

我有两个表:A和B。它们都有一个复合主键。表B的PK也是表a主键的外键

当我尝试获取映射表B的类的实例时,会出现以下异常:

org.hibernate.TypeMismatchException

该应用程序是一个Spring引导应用程序。 源代码可在

表B的代码源为:

@Entity @Table(name="usuarios")
public class UsuarioEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @EmbeddedId @AttributeOverrides( {
        @AttributeOverride(name="perTipoUsu", column=@Column(name="per_tipo_usu", nullable=false) ), 
        @AttributeOverride(name="perCodUsu", column=@Column(name="per_cod_usu", nullable=false) ) } )
    private UsuarioPKEntity pk = null;

   @OneToOne @PrimaryKeyJoinColumn
   private PersonaRelEnity personaRel = null;

   private String nombre;

   ....
}
表A的代码源是:

@Entity @Table(name="persona_rel")
public class PersonaRelEnity implements Serializable {

    private static final long serialVersionUID = 1L;

    @EmbeddedId
    private PersonaRelPKEntity id;

    private String persona;

   ....
}
这两个类都位于包com.cairone.ejempo01.entities中

完整的日志输出为:

2016-09-21 12:28:24.505错误8568---[main]
o、 s.boot.SpringApplication:应用程序启动失败

java.lang.IllegalStateException: Failed to execute CommandLineRunner
  at     org.springframework.boot.SpringApplication.callRunner(SpringApplication.ja
va:809)[spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE] 位于org.springframework.boot.SpringApplication.callRunners(SpringApplication.j ava:790)[spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE] 位于org.springframework.boot.SpringApplication.afterRefresh(SpringApplication)。 java:777)[spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE] 位于org.springframework.boot.SpringApplication.run(SpringApplication.java:308) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE] 位于org.springframework.boot.SpringApplication.run(SpringApplication.java:1191 )[spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE] 位于org.springframework.boot.SpringApplication.run(SpringApplication.java:1180 )[spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE] 在com.cairone.ejampo01.App.main(App.java:74)[classes/:na] 原因:org.springframework.dao.InvalidDataAccessApiUsageException:
org.hibernate.TypeMismatchException:为提供的id类型错误 类com.cairone.ejempo01.entities.PersonalRelity。预期:班级 com.cairone.ejompo01.entities.PersonaRelPKEntity,获得类
com.cairone.ejompo01.entities.UsuarioPKEntity;嵌套异常是
java.lang.IllegalArgumentException: org.hibernate.TypeMismatchException:为提供的id类型错误 类com.cairone.ejempo01.entities.PersonalRelity。预期:班级 com.cairone.ejempo01.entities.PersonaRelPKEntity,获取类 com.cairone.ejompo01.entities.UsuarioPKEntity 位于org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExce ptionIfPossible(entitymanagerfactorutils.java:384)~[spring orm-
4.2.6.RELEASE.jar:4.2.6.RELEASE] 位于org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionI fPossible(HibernateJpaDialect.java:227)~[spring orm-
4.2.6.RELEASE.jar:4.2.6.RELEASE] 位于org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExce ptionIfPossible(AbstractEntityManagerFactoryBean.java:436)~[spring-
orm-4.2.6.RELEASE.jar:4.2.6.RELEASE] 位于org.springframework.dao.support.ChainedPersistenceExceptionTranslator.tran SlateException可能(ChainedPersistenceExceptionTranslator.java:59) ~[spring-tx-4.2.6.释放。震击器:4.2.6.释放] 位于org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataA ccessUtils.java:213)~[spring-tx-4.2.6.RELEASE.jar:4.2.6.RELEASE] 位于org.springframework.dao.support.PersistenceExceptionTranslationInterceptor .invoke(PersistenceExceptionTranslationInterceptor.java:147) ~[spring-tx-4.2.6.释放。震击器:4.2.6.释放] 在org.springframework.aop.framework.ReflectiveMethodInvocation.Procedure(Refle activeMethodInviation.java:179)~[spring aop-
4.2.6.RELEASE.jar:4.2.6.RELEASE] 位于org.springframework.data.jpa.repository.support.crudMethodMetadataPostroc essor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetad ataPostProcessor.java:131)~[spring-data-jpa-1.9.4.RELEASE.jar:na] 在org.springframework.aop.framework.ReflectiveMethodInvocation.Procedure(Refle activeMethodInviation.java:179)~[spring aop-
4.2.6.RELEASE.jar:4.2.6.RELEASE] 在org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(Exp oseInvocationInterceptor.java:92)~[spring aop-
4.2.6.RELEASE.jar:4.2.6.RELEASE] 在org.springframework.aop.framework.ReflectiveMethodInvocation.Procedure(Refle activeMethodInviation.java:179)~[spring aop-
4.2.6.RELEASE.jar:4.2.6.RELEASE] 位于org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopP java:208)~[spring-aop-4.2.6.RELEASE.jar:4.2.6.RELEASE] 在com.sun.proxy.$Proxy69.findAll(未知源)~[na:na] 在com.cairone.ejempo01.datasources.UsuarioDataSource.buscar(UsuarioDataSour java:15)~[classes/:na] 在com.cairone.ejampo01.App.run(App.java:33)[classes/:na] 位于org.springframework.boot.SpringApplication.callRunner(SpringApplication.ja va:806)[spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]。。。6普通 由于以下原因而忽略的帧:java.lang.IllegalArgumentException: org.hibernate.TypeMismatchException:为提供的id类型错误 类com.cairone.ejempo01.entities.PersonalRelity。预期:班级 com.cairone.ejempo01.entities.PersonaRelPKEntity,获取类 com.cairone.ejompo01.entities.UsuarioPKEntity位于 org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:455) ~[hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final]at org.hibernate.jpa.criteria.compile.CriteriaQueryTypeQueryAdapter.getResultList(CriteriaQueryTypeQueryAdapter.java:67) ~[hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final]at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:323) ~[spring-data-jpa-1.9.4.RELEASE.jar:na] org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:68) ~[spring-data-jpa-1.9.4.RELEASE.jar:na] sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) ~(na:1.8.0_74)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccess
2016-09-21 12:28:24.509  INFO 8568 --- [           main]     s.c.a.AnnotationConfigApplicationContext : Closing    
@Entity
@Table(name="persona_rel")
public class PersonaRelEnity implements Serializable {

    @EmbeddedId
    private PersonaRelPKEntity pk;

    ...
}

@Embeddable
public class PersonaRelPKEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Column(name="per_tipo")
    private Integer perTipo;

    @Column(name="per_cod")
    private Integer perCod;

    ...
}

@Entity
@Table(name="usuarios")
public class UsuarioEntity implements Serializable {

    @EmbeddedId
    private UsuarioEntityPK id;

    @OneToOne
    @MapsId("personaRelPKEntity")
    @JoinColumns({
        @JoinColumn(name="per_tipo_usu", referencedColumnName="per_tipo"),
        @JoinColumn(name="per_cod_usu", referencedColumnName="per_cod")
    })
    private PersonaRelEnity personaRelEntity = null;

    ...
}

@Embeddable
public class UsuarioEntityPK implements Serializable {

    // matches the PK type of PersonaRelEnity
    private PersonaRelPKEntity personaRelPKEntity;

    ...
}