Java 为什么';t JPA是否正在更新我的实体?

Java 为什么';t JPA是否正在更新我的实体?,java,spring-data-jpa,Java,Spring Data Jpa,我有这样的Jpa存储库: public interface BalanceRepository extends JpaRepository<Balance, Long> { } 和BaseEntity @MappedSuperclass @EntityListeners(AuditingEntityListener.class) @JsonIgnoreProperties({"handler", "hibernateLazyInitializer"})

我有这样的Jpa存储库:

public interface BalanceRepository extends JpaRepository<Balance, Long> {

}
BaseEntity

    @MappedSuperclass
    @EntityListeners(AuditingEntityListener.class)
    @JsonIgnoreProperties({"handler", "hibernateLazyInitializer"})
    public abstract class BaseEntity {

        private static Logger LOGGER = LogManager.getLogger(BaseEntity.class);

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id", updatable = false, nullable = false)
        @JsonProperty("id")
        private Long id;

        public Long getId() {
            return id;
        }

        public void setId(Long id) {
               this.id = id;
            }

    public boolean isNew() {
            return id == null;
        }

 }
当我保存新的
余额
实体时,插入了新记录,但没有更新,为什么

Balance bal = new Balance();
        bal.setFinalBalance(BigDecimal.TEN);
        bal.setUser(user);
        bal.setRecordDate(date);
        bal.setMinusBalance(BigDecimal.TEN);
        bal.setPlusBalance(BigDecimal.TEN);
        bal.setTotalBalance(BigDecimal.TEN);

        // entity is inserted
        balanceRepository.save(bal);

        // no update...
        bal.setFinalBalance(bal.getFinalBalance().add(BigDecimal.TEN));
        balanceRepository.save(bal);

更新1-当我
findOne(长id)
更新记录时,值似乎已更新,但数据库中的值未更改。

尝试设置“bal=balanceRepository.save(bal);”。。。这将返回保存的对象,并将包括生成的id。。。当您运行下一次保存时,它将知道它是一个现有对象,然后将执行更新而不是保存


如果不起作用,请创建一个newBalance对象,在第一次保存时将其设置,并在第二次保存和setFinalBalance调用时使用它。

尝试以以下方式重写代码:

@Service
public class BalanceService {
  // ...
  @Transactional
  public void save(Balance balance){
     balanceRepository.save(balance);  
  }

  public void check(){
     Balance bal = new Balance();
    bal.setFinalBalance(BigDecimal.TEN);
    bal.setUser(user);
    bal.setRecordDate(date);
    bal.setMinusBalance(BigDecimal.TEN);
    bal.setPlusBalance(BigDecimal.TEN);
    bal.setTotalBalance(BigDecimal.TEN);
    // entity is inserted
    save(bal);

    bal.setFinalBalance(bal.getFinalBalance().add(BigDecimal.TEN));
    save(bal);

  }

}
告诉我它是否有用。

这部分在我看来很奇怪:

public boolean isNew() {
    return id == null;
}
因为此函数包含在
持久化接口中,并且是默认实现。请看这里:

您可以通过在
实体
中实现
持久化
接口来覆盖此功能。我之所以需要这样做,是因为我使用了一个未生成的表id作为PK

您是否尝试在
@DataJpaTest
期间保存数据?因为这会导致打开事务,而不会保存到数据库中

是平衡器位置保存(bal)的返回值与bal相同吗?如果没有,您可以尝试添加
@Version
注释。我读到这有时可能会有所帮助。 您还可以尝试实现
持久化
接口,并添加
@Version
注释,如下所示:

@Version
private Long version;

@Override
public Long getId() {
    return id;
}

@Override
public boolean isNew() {
    return version == null;
}

数据库中真的没有更新吗?合并操作不会更新您传递的实体,但会返回一个新的oneReally,不更新数据库表。。。(我用
spring.jpa.show sql=true
编写查询)更新后,您是否尝试过使用EntityManager.flush()进行查询?JPA缓存数据库请求,并在稍后(事务结束后)刷新它们。。。只要您在单个节点/应用程序上使用jpa,这就没有问题……不,我没有。真的需要吗?我认为它应该自动工作。您很可能缺少
@Transactional
annotationEntityManager.persist(第一次保存时将调用它)会更新传递给它的对象-因此
bal
具有生成的id。是的。。。我没有想到这一点。我的错。8-{我通常使用Spring Boot中的Crudepository…所以我的JPA存储库有点生锈…忽略我的答案。8-}
@Transactional
来自javax还是来自Spring?这没有任何区别。。。Spring使用代理,内部方法调用不通过代理。因此这里基本上忽略了
@Transactional
。抱歉@rvit34,没有更改。我被卡住了。
@Version
private Long version;

@Override
public Long getId() {
    return id;
}

@Override
public boolean isNew() {
    return version == null;
}