【问题标题】:Spring Data JPA how to ignore select table before insertSpring Data JPA如何在插入前忽略选择表
【发布时间】:2018-12-24 16:08:53
【问题描述】:

我的实体类有 id 字段,它使用@Id,它的策略是空的。默认策略是@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在插入之前忽略选择,怎么办?

【问题讨论】:

  • 你能展示一下你是如何保存对象的吗?
  • 我通过 @Entity 类实现 Persistable 解决了这个问题
  • 谁知道Persistable是什么?
  • JPA 没有这样的“保存”方法。 JPA 有“坚持”和“合并”
  • 这能回答你的问题吗? Force Hibernate Insert Without Select Statements

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


【解决方案1】:

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

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

【讨论】:

  • 我取消删除答案,所以有人可能会受益..谢谢。
【解决方案2】:

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

@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)为假,达到我的目的。

【讨论】:

    【解决方案3】:

    您可以使用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

    【讨论】:

    • 但是我的 Repository 类扩展了 JpaRepository , JpaSpecificationExecutor ,但是 JpaRepository 和 JpaSpecificationExecutor 不提供 persist() ?虽然它提供了 save()
    猜你喜欢
    • 2015-11-13
    • 2019-07-02
    • 1970-01-01
    • 2021-06-01
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    相关资源
    最近更新 更多