Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
@MapKey在hibernate 4.3.9版及以上版本中中断。它在4.3.8中运行良好_Hibernate_Jpa - Fatal编程技术网

@MapKey在hibernate 4.3.9版及以上版本中中断。它在4.3.8中运行良好

@MapKey在hibernate 4.3.9版及以上版本中中断。它在4.3.8中运行良好,hibernate,jpa,Hibernate,Jpa,我们的项目中有以下实体映射。在hibernate版本4.3.8之前,它工作正常,但当我升级到4.3.11时,测试用例开始失败,出现以下错误 实体映射: @实体 @表(name=“EMPLOYEE”) 公营雇员 { @身份证 @列(name=“EMPLOYEE\u ID”) 私人长id; @OneToMany(mappedBy=“owner”,cascade=CascadeType.ALL,fetch=FetchType.EAGER) @映射键(name=“phoneType”) 私有映射电话=新

我们的项目中有以下实体映射。在hibernate版本4.3.8之前,它工作正常,但当我升级到4.3.11时,测试用例开始失败,出现以下错误

实体映射:
@实体
@表(name=“EMPLOYEE”)
公营雇员
{
@身份证
@列(name=“EMPLOYEE\u ID”)
私人长id;
@OneToMany(mappedBy=“owner”,cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@映射键(name=“phoneType”)
私有映射电话=新HashMap()
...
}
@实体
@表(name=“PHONE”)
公用电话
{
@身份证
@许多酮
@JoinColumn(name=“EMPLOYEE\u ID”,referencedColumnName=“EMPLOYEE\u ID”)
@NotNull
私人雇员业主;
@身份证
@许多酮
@JoinColumn(name=“PHONE\u TYPE\u ID”,null=false)
@NotNull
@Fetch(FetchMode.SELECT)
私人电话类型;
@NotNull
@列(name=“电话号码”)
私有字符串电话号码;
...
}
@实体
@表(name=“电话类型”)
公共类电话类型
{
@身份证
@列(name=“PHONE\u TYPE\u ID”)
私人长id;
@NotNull
@列(name=“电话类型”)
私有字符串电话类型;
...
}

原因:java.lang.IllegalStateException:未能在集合联接[:OneToManyPersister(com.xyz.Employee.phones)]中找到集合索引联接 位于org.hibernate.loader.plan.exec.internal.LoadQueryJoinAndFetchProcessor.renderCollectionJoin(LoadQueryJoinAndFetchProcessor.java:353) 位于org.hibernate.loader.plan.exec.internal.LoadQueryJoinAndFetchProcessor.renderJoin(LoadQueryJoinAndFetchProcessor.java:163) 位于org.hibernate.loader.plan.exec.internal.LoadQueryJoinAndFetchProcessor.processQuerySpaceJoin(LoadQueryJoinAndFetchProcessor.java:138) 位于org.hibernate.loader.plan.exec.internal.LoadQueryJoinAndFetchProcessor.processQuerySpaceJoins(LoadQueryJoinAndFetchProcessor.java:133) 位于org.hibernate.loader.plan.exec.internal.LoadQueryJoinAndFetchProcessor.processQuerySpaceJoins(LoadQueryJoinAndFetchProcessor.java:114) 位于org.hibernate.loader.plan.exec.internal.AbstractLoadQueryDetails.generate(AbstractLoadQueryDetails.java:171) 位于org.hibernate.loader.plan.exec.internal.EntityLoadQueryDetails(EntityLoadQueryDetails.java:107) 位于org.hibernate.loader.plan.exec.internal.BatchingLoadQueryDetailsFactory.makeEntityLoadQueryDetails(BatchingLoadQueryDetailsFactory.java:73) 位于org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader。(AbstractLoadPlanBasedEntityLoader.java:100) 位于org.hibernate.loader.entity.plan.EntityLoader。(EntityLoader.java:134) 位于org.hibernate.loader.entity.plan.EntityLoader.(EntityLoader.java:55) 位于org.hibernate.loader.entity.plan.EntityLoader$Builder.byUniqueKey(EntityLoader.java:98) 位于org.hibernate.loader.entity.plan.EntityLoader$Builder.byPrimaryKey(EntityLoader.java:94) 位于org.hibernate.loader.entity.plan.AbstractBatchingEntityLoaderBuilder.buildNonBatchingLoader(AbstractBatchingEntityLoaderBuilder.java:47) 位于org.hibernate.loader.entity.BatchingEntityLoaderBuilder.buildLoader(BatchingEntityLoaderBuilder.java:76) 位于org.hibernate.persister.entity.AbstractEntityTyperSister.createEntityLoader(AbstractEntityTyperSister.java:2506) 位于org.hibernate.persister.entity.AbstractEntityTyperSister.createEntityLoader(AbstractEntityTyperSister.java:2528) 位于org.hibernate.persister.entity.AbstractEntityPersister.createLoaders(AbstractEntityPersister.java:4035) 位于org.hibernate.persister.entity.AbstractEntityPersister.PostInstate(AbstractEntityPersister.java:4017) 位于org.hibernate.internal.sessionfactorympl。(sessionfactorympl.java:481) 位于org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1859) 位于org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:857) 位于org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850) 位于org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:425) 位于org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:849) 位于org.springframework.orm.jpa.vendor.springhibernatejbapersistenceprovider.createContainerEntityManager工厂(springhibernatejbapersistenceprovider.java:60) 位于org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:343) 位于org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.AfterPropertieSet(AbstractEntityManagerFactoryBean.java:318) 位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1627) 位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1564) ... 44多

跳过的配置:@BeforeThod springTestContextBeforeTestMethod
跳过:如果密钥是实体,则应使用testPhone。

@MapKeyJoinColumn正在创建不必要的数据库更新。请看您是否同时找到了这个问题的解决方案?即使是变通方法也可以。我有类似的案例和例外:|您是否尝试了地图关联的
FetchType.LAZY
?例如:
@OneToMany(mappedBy=“owner”,cascade=CascadeType.ALL,fetch=FetchType.LAZY)
?对我来说,它似乎决定了成功映射和获得的异常之间的区别。@NándorElődFekete只有在应用程序中的某个东西尝试获取延迟加载的对象时才起作用。“你只是在用延迟加载来延迟失败。@DavidR时间过得太久了,我不能再对此进行思考了。”。
@Entity
@Table(name = "EMPLOYEE")
public class Employee 
{
  @Id
  @Column(name = "EMPLOYEE_ID")
  private long id;

  @OneToMany(mappedBy="owner", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
  @MapKey(name = "phoneType")
  private Map<PhoneType, Phone> phones = new HashMap<PhoneType, Phone>()

  ...
}

@Entity
@Table(name = "PHONE")
public class Phone 
{
  @Id
  @ManyToOne
  @JoinColumn(name = "EMPLOYEE_ID", referencedColumnName = "EMPLOYEE_ID")
  @NotNull
  private Employee owner;

  @Id
  @ManyToOne
  @JoinColumn(name = "PHONE_TYPE_ID", nullable = false)
  @NotNull
  @Fetch(FetchMode.SELECT)
  private PhoneType phoneType;

  @NotNull
  @Column(name = "PHONE_NUMBER")
  private String phoneNumber;

  ...
}

@Entity
@Table(name = "PHONE_TYPE")
public class PhoneType 
{
  @Id
  @Column(name = "PHONE_TYPE_ID")
  private long id;

  @NotNull
  @Column(name = "PHONE_TYPE")
  private String phoneType;

  ...
}