gpt4 book ai didi

hibernate - 我如何从 crudrepository 获取 entitymanager

转载 作者:行者123 更新时间:2023-12-01 13:34:51 28 4
gpt4 key购买 nike

我使用 Spring Boot 并希望提高性能。我必须在数据库中下载 50000 字段的文件。使用 hibernate 。我在 Batch inserts 中找到了解决方案.但我不知道如何从 crudrepository 获取 entitymanager

public interface MyRepository extends CrudRepository<OTA, Long>

application.yaml
jdbc.batch_size: 50
order_inserts: true
order_updates: true
cache.use_second_level_cache: true

我创建了 MyStorageService 并想保存我的文件:
@Service @Repository @Transactional public class MyStorageService {
private MyRepository myRepository;

private void insertAll(final List<MyFile> file) {
myRepository.save(file.getListLine());
}

private void insert(final List<OTA> ota) {
Session session = (Session) entityManager.getDelegate();

Transaction tx = session.beginTransaction();

for (int i = 0; i < ota.size(); i++) {
session.save(ota.get(i));
if (i % 50 == 0) {
session.flush();
session.clear();
}
}

tx.commit();
session.close();
}

}

如果在 MyStorageService 中使用
@PersistenceContext
EntityManager entityManager;

我得到

ERROR [http-nio-18842-exec-1] JpaTransactionManager: Commit exception overridden by rollback exception java.lang.IllegalStateException: Transaction not active at org.hibernate.jpa.internal.TransactionImpl.getRollbackOnly(TransactionImpl.java:131) at org.springframework.orm.jpa.JpaTransactionManager$JpaTransactionObject.isRollbackOnly(JpaTransactionManager.java:665)

ERROR [http-nio-18842-exec-1] JpaTransactionManager: Commit exception overridden by rollback exception java.lang.IllegalStateException: Transaction not active at org.hibernate.jpa.internal.TransactionImpl.getRollbackOnly(TransactionImpl.java:131) at org.springframework.orm.jpa.JpaTransactionManager$JpaTransactionObject.isRollbackOnly(JpaTransactionManager.java:665)



如果

@自动连线
EntityManager 实体管理器;

我得到

ERROR [http-nio-18842-exec-5] JpaTransactionManager: Commit exception overridden by rollback exception java.lang.IllegalStateException: Transaction not active at org.hibernate.jpa.internal.TransactionImpl.getRollbackOnly(TransactionImpl.java:131) at org.springframework.orm.jpa.JpaTransactionManager$JpaTransactionObject.isRollbackOnly(JpaTransactionManager.java:665)

java.lang.IllegalStateException: EntityManager is closed at org.hibernate.jpa.internal.EntityManagerImpl.checkOpen(EntityManagerImpl.java:97) at org.hibernate.jpa.internal.EntityManagerImpl.checkOpen(EntityManagerImpl.java:88) at org.hibernate.jpa.spi.AbstractEntityManagerImpl.clear(AbstractEntityManagerImpl.java:1382) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:347) at com.sun.proxy.$Proxy91.clear(Unknown Source) at org.springframework.orm.jpa.JpaTransactionManager.doRollback(JpaTransactionManager.java:554)



我使用基本方法 save来自 crud 存储库,但想要提高性能并使用插入。请告诉我如何从 crudrepository 获取 entitymanager。
谢谢

最佳答案

我不确定您的 Spring 配置是如何设置的。希望这可能会有所帮助,给你:

如果你已经设置了org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean的bean在您的上下文 xml 或 @Configuration java 文件中,在这种情况下,您可以通过以下方式获取实体管理器。

假设您按如下方式声明了上述内容:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSourceRefToBeMentioned"/>
<property name="packagesToScan" value="package.to.be.mentioned"/>
<property name="jpaVendorAdapter" ref="hibernateJPAVendorAdapter"/>
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>

现在在您的服务类中,您可以 Autowiring LocalContainerEntityManagerFactoryBean,如下所示。
@Autowired
LocalContainerEntityManagerFactoryBean entityManagerFactory;

在您想要访问实体管理器的方法中,您可以执行以下操作:
EntityManager entityManager = entityManagerFactory.getObject().createEntityManager();

在此之后,将遵循以下代码:
Session session = (Session) entityManager.getDelegate();
Transaction tx = session.beginTransaction();
....
...
tx.commit();
session.close();

但是,请确保在完成整个事务后关闭 entityManager,如下所示:
entityManager.close();

希望这可以帮助。

关于hibernate - 我如何从 crudrepository 获取 entitymanager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44331164/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com