簡體   English   中英

如何使用Hibernate以特殊順序保存對象?

[英]How do i save objects in a special order with Hibernate?

早上好,

這是我的第一個問題,請保持溫柔! ;-)如果您需要更多信息,請告訴我!

我正在使用Hibernate 3.2.1,並創建一個Java批處理應用程序,該應用程序讀取文本文件,將記錄轉換為Java對象,然后將其保存到數據庫中。 文本文件由許多記錄組組成,我應該在一組記錄完全完成后才“提交”。 我使用序列生成器創建對象ID。

我的問題是,在某些情況下,ID的順序很重要-我不知道如何影響它。

[編輯]

我會舉一個例子:

Retourmeldung r1 = new Retourmeldung();
Retourmeldung r2 = new Retourmeldung();

r1.process();
r2.process();

getEntityManager().merge(r1);
getEntityManager().merge(r2);
        getEntityManager().flush();

有必要使r1的ID低於r2(例如:r1.getID()= 213和r2.getID()= 214),因為另一個程序將再次讀取數據庫,並且不同的記錄將位於特殊設置。

[/編輯]

有任何想法嗎?

謝謝海倫

編輯:添加時的異常堆棧跟蹤

@Id 
@Column(name="ID",unique=true,nullable=false,precision=16) 
@GeneratedValue(generator="RETOURMELDUNG") 
@SequenceGenerator(name="RETOURMELDUNG",sequenceName="SEQ_RETOURMELDUNG") 
@Generated(GenerationTime.INSERT)



> org.springframework.beans.factory.BeanCreationException: Error
> creating bean with name 'functionServiceDAO': Autowiring of fields
> failed; nested exception is
> org.springframework.beans.factory.BeanCreationException: Could not
> autowire field: private
> at.sozvers.svb.lkfEinarb.batch.dao.jpa.Speicherservice
> at.sozvers.svb.lkfEinarb.batch.dao.impl.FunctionServiceDAOImpl.speicherservice;
> nested exception is
> org.springframework.beans.factory.BeanCreationException: Error
> creating bean with name 'speicherservice': Autowiring of fields
> failed; nested exception is
> org.springframework.beans.factory.BeanCreationException: Could not
> autowire field: private javax.persistence.EntityManagerFactory
> at.sozvers.svb.lkfEinarb.batch.dao.jpa.Speicherservice.factory; nested
> exception is org.springframework.beans.factory.BeanCreationException:
> Error creating bean with name 'entityManagerFactory' defined in class
> path resource [META-INF/lkfEinarbApplicationContext.xml]: Invocation
> of init method failed; nested exception is
> java.lang.NullPointerException
>       at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessAfterInstantiation(AutowiredAnnotationBeanPostProcessor.java:243)
>       at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:959)
>       at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
>       at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
>       at java.security.AccessController.doPrivileged(Native Method)
>       at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
>       at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
>       at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
>       at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
>       at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
>       at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
>       at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
>       at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
>       at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
>       at at.sozvers.svb.lkfEinarb.batch.main.LkfEinarbVerarbeitung.<init>(LkfEinarbVerarbeitung.java:26)
>       at at.sozvers.svb.lkfEinarb.batch.main.LkfEinarbMain.main(LkfEinarbMain.java:20)
>     Caused by: org.springframework.beans.factory.BeanCreationException: Could not
> autowire field: private
> at.sozvers.svb.lkfEinarb.batch.dao.jpa.Speicherservice
> at.sozvers.svb.lkfEinarb.batch.dao.impl.FunctionServiceDAOImpl.speicherservice;
> nested exception is
> org.springframework.beans.factory.BeanCreationException: Error
> creating bean with name 'speicherservice': Autowiring of fields
> failed; nested exception is
> org.springframework.beans.factory.BeanCreationException: Could not
> autowire field: private javax.persistence.EntityManagerFactory
> at.sozvers.svb.lkfEinarb.batch.dao.jpa.Speicherservice.factory; nested
> exception is org.springframework.beans.factory.BeanCreationException:
> Error creating bean with name 'entityManagerFactory' defined in class
> path resource [META-INF/lkfEinarbApplicationContext.xml]: Invocation
> of init method failed; nested exception is
> java.lang.NullPointerException
>       at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:435)
>       at org.springframework.beans.factory.annotation.InjectionMetadata.injectFields(InjectionMetadata.java:105)
>       at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessAfterInstantiation(AutowiredAnnotationBeanPostProcessor.java:240)
>       ... 15 more
>     Caused by: org.springframework.beans.factory.BeanCreationException: Error
> creating bean with name 'speicherservice': Autowiring of fields
> failed; nested exception is
> org.springframework.beans.factory.BeanCreationException: Could not
> autowire field: private javax.persistence.EntityManagerFactory
> at.sozvers.svb.lkfEinarb.batch.dao.jpa.Speicherservice.factory; nested
> exception is org.springframework.beans.factory.BeanCreationException:
> Error creating bean with name 'entityManagerFactory' defined in class
> path resource [META-INF/lkfEinarbApplicationContext.xml]: Invocation
> of init method failed; nested exception is
> java.lang.NullPointerException
>       at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessAfterInstantiation(AutowiredAnnotationBeanPostProcessor.java:243)
>       at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:959)
>       at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
>       at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
>       at java.security.AccessController.doPrivileged(Native Method)
>       at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
>       at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
>       at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
>       at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
>       at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
>       at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
>       at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:671)
>       at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:610)
>       at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:412)
>       ... 17 more
>     Caused by: org.springframework.beans.factory.BeanCreationException: Could not
> autowire field: private javax.persistence.EntityManagerFactory
> at.sozvers.svb.lkfEinarb.batch.dao.jpa.Speicherservice.factory; nested
> exception is org.springframework.beans.factory.BeanCreationException:
> Error creating bean with name 'entityManagerFactory' defined in class
> path resource [META-INF/lkfEinarbApplicationContext.xml]: Invocation
> of init method failed; nested exception is
> java.lang.NullPointerException
>       at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:435)
>       at org.springframework.beans.factory.annotation.InjectionMetadata.injectFields(InjectionMetadata.java:105)
>       at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessAfterInstantiation(AutowiredAnnotationBeanPostProcessor.java:240)
>       ... 30 more
>     Caused by: org.springframework.beans.factory.BeanCreationException: Error
> creating bean with name 'entityManagerFactory' defined in class path
> resource [META-INF/lkfEinarbApplicationContext.xml]: Invocation of
> init method failed; nested exception is java.lang.NullPointerException
>       at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1338)
>       at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
>       at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
>       at java.security.AccessController.doPrivileged(Native Method)
>       at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
>       at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
>       at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
>       at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
>       at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
>       at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
>       at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:671)
>       at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:610)
>       at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:412)
>       ... 32 more
>     Caused by: java.lang.NullPointerException
>       at org.hibernate.cfg.annotations.PropertyBinder.make(PropertyBinder.java:145)
>       at org.hibernate.cfg.AnnotationBinder.bindId(AnnotationBinder.java:1738)
>       at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1180)
>       at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:710)
>       at org.hibernate.cfg.AnnotationConfiguration.processArtifactsOfType(AnnotationConfiguration.java:452)
>       at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:268)
>       at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1112)
>       at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1233)
>       at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:154)
>       at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:869)
>       at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:407)
>       at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:126)
>       at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:224)
>       at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:291)
>       at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1369)
>       at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1335)
>       ... 44 more
>     Programm LkfEinarb-Batch fehlerhaftes Programmende 17-12-2013 10:11:17

您需要為每個實體考慮單獨的ID生成器,如下所示。

@Id
@Column(name = "id", unique = true, nullable = false)
@SequenceGenerator(name = "classname_seq_generator", sequenceName = "classname_id_seq")
@GeneratedValue(generator = "classname_seq_generator")
@Generated(GenerationTime.INSERT)
Long id;

您可以在合並后刷新會話,以便在第二個合並之前將其實際插入。

參考這里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM