Hibernate Spring数据JPA如何在插入前忽略select表

Hibernate Spring数据JPA如何在插入前忽略select表,hibernate,spring-boot,spring-data-jpa,Hibernate,Spring Boot,Spring Data Jpa,我的实体类有id字段,它使用@id,它的策略为null。默认策略是@GeneratedValue(Strategy=GenerationType.AUTO)) 当我调用JPA save方法时,它总是在插入之前调用sql select,查询日志如下所示: 第一次查询: Hibernate: select dataeviden0_.id as id1_0_0_, dataeviden0_.block_hash as block_ha2_0_0_ from table1 dataeviden0_ wh

我的实体类有id字段,它使用
@id
,它的策略为null。默认策略是
@GeneratedValue(Strategy=GenerationType.AUTO))

当我调用JPA save方法时,它总是在插入之前调用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 (?, ?)
第二次查询

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在插入之前忽略选择,怎么做?

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

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


从这里开始

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

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


从这里开始,@Alien现在不再删除的答案基本上是正确的。该语句来自使用
merge
的Spring数据JPA,如果您使用
persist
它应该消失


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

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

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

解决我的问题,实体实现持久化,并覆盖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);
    }
@Transactional
公共存储(S实体){
if(entityInformation.isNew(实体)){
em.persist(实体);
返回实体;
}否则{
返回em.merge(实体);
}
如果save方法判断entityInformation.isNew(entity)为false,并达到我的目标。

解决我的问题,该实体实现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);
    }
@Transactional
公共存储(S实体){
if(entityInformation.isNew(实体)){
em.persist(实体);
返回实体;
}否则{
返回em.merge(实体);
}

如果save方法会判断entityInformation.isNew(entity)为false,并达到我的目标。

你能展示一下你是如何保存对象的吗?我通过@entity class实现持久化来解决这个问题,谁知道什么是持久化的?JPA没有这样的“save”方法。JPA有“persist”和“merge”这回答了你的问题吗?你能展示一下你是如何保存对象的吗?我通过@Entity class实现持久化来解决这个问题,谁知道什么是
持久化的
?JPA没有这样的“保存”方法。JPA有“持久化”和“合并”这是否回答了您的问题?但我的存储库类扩展了JpaRepository、JpaSpecificationExecutor,但JpaRepository和JpaSpecificationExecutor在提供save()时不提供persist()但是我的Repository类扩展了JpaRepository、JpaSpecificationExecutor,但是JpaRepository和JpaSpecificationExecutor不提供persist()?虽然它提供save(),但我取消删除答案,以便有人可以受益..谢谢.我取消删除答案,以便有人可以受益..谢谢。