Spring Data JPA如何在插入之前忽略选择表

时间:2018-07-17 04:23:41

标签: hibernate spring-boot spring-data-jpa

我的实体类具有id字段,并且使用@Id,并且其策略为null。默认策略为@GeneratedValue(strategy = GenerationType.AUTO))

当我调用JPA保存方法时,它总是在插入之前先调用sql select ,查询日志就像下面这样:

首次查询

Hibernate: select dataeviden0_.id as id1_0_0_, dataeviden0_.block_hash as block_ha2_0_0_ from table1 dataeviden0_ where dataeviden0_.id=?

第二个查询

Hibernate: insert into table1 (block_hash, id) values (?, ?)

我可以自己控制id,我希望jpa在插入之前忽略select,怎么办?

3 个答案:

答案 0 :(得分:1)

您可以使用persist()方法而不是save()

https://forum.hibernate.org/viewtopic.php?f=1&t=1011405

但是,与save()不同,persist()不能保证标识符值将在持久实例上立即设置。

https://forum.hibernate.org/viewtopic.php?t=951275

从这里Force Hibernate Insert Without Select Statements

答案 1 :(得分:1)

@Alien现在不再删除的答案基本上是正确的。该语句来自使用merge的Spring Data JPA,如果您使用persist,则该语句应消失。

为此,您必须在存储库中公开persist方法。使用custom method implementation和注入的EntityManager应该很容易。如果仅使用该存储库保存新实例,则可以根据需要甚至为现有save方法提供自定义实现。

答案 2 :(得分:1)

bulk-inserting-existing-data-preventing-jpa-to-do-a-select-before-every-insert解决了我的问题,该实体实现Persistable,并覆盖isNew(){return false; },它将在插入之前忽略select,因为

@Transactional
public <S extends T> S save(S entity) {

    if (entityInformation.isNew(entity)) {
        em.persist(entity);
        return entity;
    } else {
        return em.merge(entity);
    }

它的save方法将判断EntityInformation.isNew(entity)为假,并达到我的目标。