下面的代码被简化了,但基本上是:对于传入列表中的每个Json对象,都创建了两个实体:DataEntity和IdentityEntity。前者持有感兴趣的数据,用后者作为FK,有一个时间和一个人的复合PK。
我想加快储存过程。我通过一个探查器确定,在插入每个新实体之后要执行的刷新操作太多了。由于我需要在给定的时间插入数千条记录,这会导致性能问题。我是否可以在一个事务中进行插入,或者有什么其他优化它的方法?
数据类(我有很多类似的类):
@Entity
public class DataEntity {
@EmbeddedId
private IdentityEntity identity;
private Double data;
}
@Embeddable
public class IdentityEntity implements Serializable {
@NonNull
private Long personId;
@NonNull
private Long datetimeId;
}
@Repository
public interface DataRepository extends JpaRepository<DataEntity, IdentityEntity> {}
public class DataController{
@Autowired
private DataRepository dataRepository;
@Autowired
private DatetimeRepository datetimeRepository;
@PostMapping("/upload")
public void upload(...List<DataJson> items) {
PersonEntity person = getPerson(...); // fast enough
for (DataJson i : items) { // begin transaction here?
saveNewEntity(i, person.getId());
}
}
private void saveNewEntity(DataJson json, Long personId) {
TimeEntity savedDatetime = datetimeRepository.save(new TimeEntity(json.getDatetime()));
IdentityEntity mi = IdentityEntity(personId, savedDatetime.getId());
DataEntity entry = new DataEntity(mi, json.getData());
dataRepository.save(entry);
}
}
编辑:在深入挖掘探查器之后,我发现另一个耗时的操作可能是事务管理本身。虽然我还没有实现或配置任何事务行为,但我怀疑Spring Boot为Hibernate ORM默认配置了一些东西。我开始认为,现在在循环的每次迭代中都创建了一个事务,这是第一个性能问题,也引起了第二个问题,在事务结束时,所有的东西都被刷新并写入DB。
是啊。SimpleJarepository
中的所有方法都用@transactional
进行了注释。
只需向上载方法添加@transactional
注释。
...或
问题内容: 说,我有以下实体: 通过结合使用模式自动生成功能,我得到了一个附加表,其中包含和之间的映射。但是,我想实现通过添加一个一对多的关系的 编号 为( 例如,没有附加表 )。 这可能吗?如果是,我应该使用什么注释来创建这种映射? 问题答案: 通常,使用@JoinColumn批注是可能的。它也适用于可嵌入对象。 如果您对embeddable中指定的列的A_ID名称不满意,则可以覆盖实体A中的列
主要内容:JPA实体插入示例在JPA中,我们可以通过实体轻松地将数据插入到数据库中。 提供方法来插入数据记录。 JPA实体插入示例 在这里,我们将演示如何使用实现插入学生的记录。 创建一个JPA项目,其项目目录结构如下所示 - 这个例子包含以下步骤 - 第1步: 在包下创建一个名为StudentEntity.java的实体类,这个类包含以下几个属性:, 和 。 文件:StudentEntity.java 的代码如下 - 第2
我有一个测试用例,需要将100,000个实体实例持久化到数据库中。我当前使用的代码就是这样做的,但直到将所有数据持久化到数据库中为止,最多需要40秒。数据是从一个大约15 MB大小的JSON文件中读取的。 现在,我已经为另一个项目在自定义存储库中实现了批处理插入方法。但是,在这种情况下,我有很多顶级实体要持久化,只有几个嵌套实体。 在我当前的例子中,我有5个实体,这些实体包含大约30个实体的列表。
我有一个实体,它的复合主键由两个字段组成,其中一个也是复合外键的一部分。 背景:我有实体<代码>人员 、<代码>区域 和<代码>会话 。 与具有多对多关系,使用称为“和实体。 所以,我有,主键为(,)。本身是的外键。 也有一个字段。我希望(,)是的复合外键。 我的PersonSession代码: } 这看起来不错,它在数据库中创建了所有正确的关系。当我尝试插入个性化会话对象时,问题就出现了——ar
} 存储库类: 服务类别:
我定义了2个具有单向一对多关系的实体: 在command.class中: 在StockDetails.class中: null