【问题标题】:Mapping muti-level embedded collection gives exception映射多级嵌入式集合给出异常
【发布时间】:2017-09-09 06:46:42
【问题描述】:

我确实有一个实体 Root

@Entity
public class Root {
    @Id
    String id;

    @ElementCollection
    @CollectionTable
    List<Col> cols ;

Collection Item 'Col' 本身有一个嵌入对象

@Embeddable
public class Col {

    @Embedded
    private Emb emb;

“Emb”对象非常简单

@Embeddable
public class Emb {

    String embField;

我希望数据库表是这样的

表:ROOT 字段:ID

表:ROOT_COLS 字段:ROOT_ID、EMB_FIELD

启动这个 Spring Boot 应用程序会给我一个 ArrayIndexOutOfBoundsException

我该如何解决这个问题?

休眠版本:5.0.12

org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class] 中定义名称为“entityManagerFactory”的 bean 创建错误:调用 init 方法失败;嵌套异常是 javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 在 org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1081) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE] 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:856) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE] 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE] 在 org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 在 org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 在 org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:314) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 在 ch.admin.estv.map.Application.main(Application.java:33) [classes/:na] 引起:javax.persistence.PersistenceException:[PersistenceUnit:默认]无法构建Hibernate SessionFactory 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:954) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final] 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:882) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final] 在 org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) ~[spring-orm-4.3.7.RELEASE.jar:4.3.7.RELEASE] 在 org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353) ~[spring-orm-4.3.7.RELEASE.jar:4.3.7.RELEASE] 在 org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:370) ~[spring-orm-4.3.7.RELEASE.jar:4.3.7.RELEASE] 在 org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:359) ~[spring-orm-4.3.7.RELEASE.jar:4.3.7.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] ...省略了16个常用框架 引起:org.hibernate.MappingException:无法实例化集合持久化 org.hibernate.persister.collection.BasicCollectionPersister 在 org.hibernate.persister.internal.PersisterFactoryImpl.createCollectionPersister(PersisterFactoryImpl.java:167) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 在 org.hibernate.persister.internal.PersisterFactoryImpl.createCollectionPersister(PersisterFactoryImpl.java:140) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 在 org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:399) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 在 org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final] ...省略了22个常用框架 引起:java.lang.ArrayIndexOutOfBoundsException:1 在 org.hibernate.persister.collection.AbstractCollectionPersister.initCollectionPropertyMap(AbstractCollectionPersister.java:1914) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 在 org.hibernate.persister.collection.AbstractCollectionPersister.initCollectionPropertyMap(AbstractCollectionPersister.java:1891) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 在 org.hibernate.persister.collection.AbstractCollectionPersister.(AbstractCollectionPersister.java:592) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 在 org.hibernate.persister.collection.BasicCollectionPersister.(BasicCollectionPersister.java:57) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_121] 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_121] 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_121] 在 java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_121] 在 org.hibernate.persister.internal.PersisterFactoryImpl.createCollectionPersister(PersisterFactoryImpl.java:152) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] ... 省略了 26 个常用帧

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    问题是实体的默认访问权限是字段,而嵌入对象的默认访问权限是属性。

    所以 Col 类应该是

    @Embeddable
    @Access(AccessType.FIELD)
    public class Col {
        @Embedded
        private Emb emb;
    

    和 Emb 类

    @Embeddable
    @Access(AccessType.FIELD)
    public class Emb {
        String embField;
    

    我会喜欢一个比 ArrayIndexOutOfBoundsException 更好的错误消息!

    【讨论】:

    • 在我的情况下,尚不清楚哪个 Embeddable 类是问题所在。我最终将@Access 注释应用于我所有的嵌入类来解决问题。
    猜你喜欢
    • 2018-02-24
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 2013-10-07
    • 2021-11-06
    • 2014-01-22
    • 2011-12-01
    相关资源
    最近更新 更多