2011-03-10 50 views
10

我想知道是否可以在另一个Embeddable内嵌入一个可嵌入的ElementCollection?JPA可嵌入是否可以包含Embeddable或Embeddables嵌入?

这里是它有地址的列表我的供应商实体,它是一个可嵌入类的例子:

@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; 
... 

即时通讯目前与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; 
    } 

请分享您的想法!

谢谢!

回答

18

JPA 2规范说不。

JSR-317嵌入类和包含的元素集合中不能包含的元素集合基本类型

可嵌入类(包括另一嵌入类内的嵌入级)

2.6类别,也不可以包含与多对一或一对一关系以外的实体的关系

+1

实体是否可以包含可嵌入的集合? – user12458 2014-06-27 12:35:47

相关问题