【发布时间】:2017-06-28 20:44:07
【问题描述】:
我有这样的 Jpa 存储库:
public interface BalanceRepository extends JpaRepository<Balance, Long> {
}
据我所知(并且这个answer 确认)实体管理器插入新记录(当实体是新的时)并在不是新的时更新实体记录。
我的实体类层次结构:
@Entity
@Table(name = "balances")
public class Balance extends BaseEntity {
// omitted
}
和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 实体时,插入了新记录但没有完成更新,为什么?
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(Long id)更新记录时,值似乎更新了,但数据库中的值没有改变。
【问题讨论】:
-
数据库真的没有更新吗?合并操作不会更新你传递的实体,而是会返回一个新的
-
真的,数据库表没有更新...(我用
spring.jpa.show-sql=true写出查询) -
您是否尝试在更新后执行 entityMananger.flush()? JPA 缓存数据库请求并稍后(在事务结束后)刷新它们...只要您在单个节点/应用程序上使用 jpa 就没有问题...
-
不,我没有。真的需要吗?我认为它应该自动工作。
-
您很可能缺少
@Transactional注释
标签: java spring-data-jpa