我使用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。
谢谢
只是自动装配实体管理器
@Autowired
EntityManager entityManager;
在我看来,有几个潜在的问题。
因此,我建议您分离关注点,例如,如果您想自己管理事务,请删除不必要的注释,如@Service和@Transactional,但是根据您的代码,这是没有必要的,除非您在每个批处理完成后在for循环中提交。
我不确定您的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如何工作?实例化