当前位置: 首页 > 知识库问答 >
问题:

如何从crudrepository获取entityManager

郑宏朗
2023-03-14

我使用Spring靴,希望提高性能。我必须下载数据库中有50000个字段的文件。使用hibernate。我在批量插入中找到了解决方案。但我不知道如何从Crudepository获得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 html" target="_blank">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;

我明白了

错误[http-nio-18842-exec-1]JpaTransactionManager:提交异常被回滚异常java覆盖。lang.IllegalStateException:组织中的事务不活动。冬眠jpa。内部的TransactionImpl。org上的getRollbackOnly(TransactionImpl.java:131)。springframework。奥姆。jpa。JpaTransactionManager$JpaTransactionObject。isRollbackOnly(JpaTransactionManager.java:665)

错误[http-nio-18842-exec-1]JpaTransactionManager:提交异常被回滚异常java覆盖。lang.IllegalStateException:组织中的事务不活动。冬眠jpa。内部的TransactionImpl。org上的getRollbackOnly(TransactionImpl.java:131)。springframework。奥姆。jpa。JpaTransactionManager$JpaTransactionObject。isRollbackOnly(JpaTransactionManager.java:665)

如果

@自动连线
EntityManager EntityManager;

我明白了

错误[http-nio-18842-exec-5]JpaTransactionManager:提交异常被回滚异常java覆盖。lang.IllegalStateException:组织中的事务不活动。冬眠jpa。内部的TransactionImpl。org上的getRollbackOnly(TransactionImpl.java:131)。springframework。奥姆。jpa。JpaTransactionManager$JpaTransactionObject。isRollbackOnly(JpaTransactionManager.java:665)

JAVAlang.IllegalStateException:EntityManager在org关闭。冬眠jpa。内部的EntityManagerImpl。在org上选中open(EntityManagerImpl.java:97)。冬眠jpa。内部的EntityManagerImpl。在org上打开checkOpen(EntityManagerImpl.java:88)。冬眠jpa。spi。AbstractEntityManagerImpl。在sun上清除(AbstractEntityManagerImpl.java:1382)。反映NativeMethodAccessorImpl。在sun上调用0(本机方法)。反映NativeMethodAccessorImpl。在sun上调用(NativeMethodAccessorImpl.java:62)。反映DelegatingMethodAccessorImpl。在java上调用(DelegatingMethodAccessorImpl.java:43)。朗,反思一下。方法在org上调用(Method.java:498)。springframework。奥姆。jpa。ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler。在com上调用(ExtendedEntityManagerCreator.java:347)。太阳代理$Proxy91。清除组织中的(未知来源)。springframework。奥姆。jpa。JpaTransactionManager。doRollback(JpaTransactionManager.java:554)

我使用base方法从crud存储库中保存,但想提高性能并使用插入。请告诉我如何从crudrepository获取entityManager。
谢谢

共有3个答案

东门新立
2023-03-14

只是自动装配实体管理器

@Autowired
EntityManager entityManager;
颜志学
2023-03-14

在我看来,有几个潜在的问题。

  • @Service和@Repository都是原型注释,允许Spring自动检测注释类并在上下文中注册。区别在于,当与PersistenceExceptionTranslationPostProcessor结合使用时,使用@Repository注释的类有资格进行Spring DataAccessException转换

因此,我建议您分离关注点,例如,如果您想自己管理事务,请删除不必要的注释,如@Service和@Transactional,但是根据您的代码,这是没有必要的,除非您在每个批处理完成后在for循环中提交。

鲍驰
2023-03-14

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

如果你已经建立了org的bean。springframework。奥姆。jpa。LocalContainerEntityManagerFactoryBean在您的上下文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>

现在,在您的服务类中,您可以自动连接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();

希望这有帮助。

 类似资料:
  • 如何从(在清单中)使用java?

  • 问题内容: 我正在使用蜡染来处理SVG图像。有什么办法可以从SVG文件中获取java.awt.image.BufferedImage吗? 我知道有一些转码器,我可以使用它们将SVG转码为PNG,然后使用ImageIO.read()加载该PNG,但是我不想拥有临时文件。 问题答案: 使用蜡染,如下所示:

  • 问题内容: 我正在使用HttpClient 4.1.2 那么,如何获取Cookie值? 问题答案: 请注意:第一个链接指向曾经在HttpClient V3中工作的内容。在下面找到与V4相关的信息。 这应该回答你的问题 http://www.java2s.com/Code/Java/Apache- Common/GetCookievalueandsetcookievalue.htm 以下与V4有关:

  • 问题内容: 如何从BufferedImage对象获取InputStream?我尝试了这个,但是ImageIO.createImageInputStream()总是返回NULL 图片缩略图已正确生成,因为我可以成功将 bigImage绘制 到 JPanel 。 谢谢。 问题答案: 如果您尝试将图像保存到文件,请尝试: 如果您只想读取字节,请尝试执行写调用,但将其传递给ByteArrayOutputS

  • 问题内容: 我想从java.io.InputStream读取超时。显然,执行此操作的正确方法是使用java.nio.channels.SelectableChannel和java.nio.channels.Selector。不幸的是,目前尚不清楚如何从InputStream转到SelectableChannel。 InputStream来自非常规来源-http://java.sun.com/pro

  • 问题内容: 是否可以从ServletContext获取HttpServletRequest? 问题答案: 是否可以从ServletContext获取HttpServletRequest? 没有。 该代表的应用程序。该应用程序可以涵盖许多会话和请求。但是您无法通过来获取“当前正在运行”的请求或会话。有关servlet和作用域如何工作的详细信息,可以在以下相关答案中找到:servlet如何工作?实例化