Java 为什么';t JPA是否正在更新我的实体?
我有这样的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"})
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;
}