Java 使用JPA映射复合主键和外键
我有两个表:A和B。它们都有一个复合主键。表B的PK也是表a主键的外键 当我尝试获取映射表B的类的实例时,会出现以下异常: org.hibernate.TypeMismatchException 该应用程序是一个Spring引导应用程序。 源代码可在 表B的代码源为: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
@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;
...
}