JPA可嵌入对象是否可能包含可嵌入对象或可嵌入对象集合?

我想知道是否有可能在另一个Embeddable中包含Embeddable的ElementCollection?

这是我的供应商实体的示例,该实体具有可嵌入类型的地址列表:

@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.springframework.beans.factory.support.DefaultListableBeanFactory@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;

}


请分享您的想法!

谢谢 !

回答:

JPA 2规范说不。

JSR-317

2.6可嵌入类和基本类型的集合

元素集合中包含的可嵌入类(包括另一个可嵌入类中的可嵌入类)不得包含元素集合,也不得包含与多对一或一对一之外的实体的关系关系

以上是 JPA可嵌入对象是否可能包含可嵌入对象或可嵌入对象集合? 的全部内容, 来源链接: utcz.com/qa/398841.html

回到顶部