Подтвердить что ты не робот

Возможно ли встраиваемое JPA встраивать встраиваемые или встраиваемые вложения?

Интересно, возможно ли иметь ElementCollection встраиваемого внутри другого Embeddable?

Вот пример моего объекта поставщика, который имеет список Адресов, который имеет вложенный тип:

@Entity
public class Supplier extends BaseCommonEntity {
    @Column(unique=true)
    private String supplierCode;    

    private String supplierName;

    @ElementCollection
    private List<Address> addresses;
....

И вот мой вложенный адрес, содержащий список встраиваемых телефонов

@Embeddable
public class Address {
    private String address;
    private String city;
    private String country;
    private String postcode;

    @ElementCollection
    private List<Phone> phones;
    public List<Phone> getPhones() {
        return phones;
    }

    public void setPhones(List<Phone> phones) {
        this.phones = phones;
    }
...

И вот определение встроенного телефона

@Embeddable
public class Phone {
    private Long phoneCountryCode;
    private Long phoneCityCode;
    private Long phoneNo;
    private Long faxCountryCode;
    private Long faxCityCode;
    private Long faxNo;
...

Im в настоящее время тестирует это с помощью JPA 2 + Hibernate 3.6.x

Использование встроенного телефона внутри адреса приводит к ошибке в моем тесте. Здесь частичные отладочные сообщения из самого нижнего:

DEBUG PropertyBinder - Building property country
DEBUG Ejb3Column - Binding column: Ejb3JoinColumn{logicalColumnName='null', referencedColumn='null', mappedBy=''}
DEBUG Ejb3Column - Binding column: Ejb3Column{table=org.hibernate.mapping.Table(Supplier_addresses), mappingColumn=phones, insertable=true, updatable=true, unique=false}
DEBUG Ejb3Column - Binding column: Ejb3Column{table=org.hibernate.mapping.Table(Supplier_addresses), mappingColumn=null, insertable=true, updatable=true, unique=false}
DEBUG Ejb3Column - Binding column: Ejb3Column{table=org.hibernate.mapping.Table(Supplier_addresses), mappingColumn=phones, insertable=true, updatable=true, unique=false}
DEBUG Ejb3Column - Binding column: Ejb3Column{table=org.hibernate.mapping.Table(Supplier_addresses), mappingColumn=phones_KEY, insertable=true, updatable=true, unique=false}
DEBUG Ejb3Column - Binding column: Ejb3JoinColumn{logicalColumnName='phones_KEY', referencedColumn='null', mappedBy='null'}
DEBUG Ejb3Column - Binding column: Ejb3JoinColumn{logicalColumnName='null', referencedColumn='null', mappedBy=''}
DEBUG Ejb3Column - Binding column: Ejb3JoinColumn{logicalColumnName='null', referencedColumn='null', mappedBy=''}
DEBUG CollectionBinder - Collection role: com.primetech.core.entity.Supplier.addresses.collection&&element.phones
DEBUG PropertyBinder - Building property phones
DEBUG Ejb3Column - Binding column: Ejb3Column{table=org.hibernate.mapping.Table(Supplier_addresses), mappingColumn=postcode, insertable=true, updatable=true, unique=false}
DEBUG PropertyBinder - binding property postcode with lazy=false
DEBUG SimpleValueBinder - building SimpleValue for postcode
DEBUG SimpleValueBinder - Setting SimpleValue typeName for postcode
DEBUG PropertyBinder - Building property postcode
DEBUG CollectionSecondPass - Mapped collection key: Supplier_id, element: address, city, country, postcode
DEBUG DefaultListableBeanFactory - Retrieved dependent beans for bean 'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#102799c': [entityManagerFactory]
INFO  DefaultListableBeanFactory - Destroying singletons in org.s[email protected]f6ac0b: defining beans [dataSource,entityManagerFactory,testEntities,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,transactionManager,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor]; root of factory hierarchy
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [test.xml]: Invocation of init method failed; nested exception is java.util.ConcurrentModificationException
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1412)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:557)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93)
    at com.primetech.module.purchase.app.TestEntities.main(TestEntities.java:27)
Caused by: java.util.ConcurrentModificationException
    at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
    at java.util.AbstractList$Itr.remove(AbstractList.java:357)
    at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1687)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1393)
    at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1345)
    at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1477)
    at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:193)
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:1096)
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:685)
    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:73)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:225)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:308)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1469)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1409)
    ... 12 more

Удаление этой части решает проблему

    /**** REMOVE ALL OF THIS FROM THE CODE TO SOLVE THE PROBLEM ****/
    @ElementCollection
    private List<Phone> phones;
    public List<Phone> getPhones() {
        return phones;
    }

    public void setPhones(List<Phone> phones) {
        this.phones = phones;
    }

Поделитесь своими мыслями!

Спасибо!

4b9b3361

Ответ 1

JPA 2 spec говорит "нет".

JSR-317

2.6 Коллекции встраиваемых классов и основных типов

Встраиваемый класс (включая вложенный класс внутри другого встраиваемого класса), который содержится в коллекции элементов, не должен содержать коллекцию элементов и не может содержать отношения к объекту, отличному от многозначного, к-одному