使用JPA更新MagicnotifyCart表desired_price字段失败求助
问题分析与解决方案
你的核心问题是错误地将desired_price字段放到了复合主键类中,JPA不会跟踪主键字段的修改(主键用于唯一标识实体,设计上是不可变的),因此即使你修改了magicnotifyCart.getId().setDesired_price()的值,数据库也不会同步更新。
步骤1:修正实体类结构
首先需要调整MagicnotifyCart的实体映射,将desired_price从主键类中剥离,作为实体的普通字段:
1.1 定义复合主键类
创建仅包含uuid和userid的主键类(对应表的联合主键):
@Embeddable public class MagicnotifyCartId implements Serializable { @Column(name = "uuid", length = 50) private String uuid; @Column(name = "userid") private Long userid; // 必须实现equals()和hashCode() @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; MagicnotifyCartId that = (MagicnotifyCartId) o; return Objects.equals(uuid, that.uuid) && Objects.equals(userid, that.userid); } @Override public int hashCode() { return Objects.hash(uuid, userid); } // 构造器、getter/setter }
1.2 修正MagicnotifyCart实体类
将desired_price作为实体的独立字段,关联复合主键:
@Entity @Table(name = "MagicnotifyCart") public class MagicnotifyCart { @EmbeddedId private MagicnotifyCartId id; @Column(name = "desired_price", precision = 10, scale = 2) private BigDecimal desiredPrice; // getter/setter }
步骤2:修改更新方法
调整业务方法,直接操作实体的普通字段即可(事务内的托管实体,JPA会自动同步到数据库,甚至可以省略save()):
@Transactional public void updateDesiredPrice(BigDecimal desiredPrice, String uuid, int userId) { MagicnotifyCart magicnotifyCart = cartRepository.findMagicnotifyCartById_UuidAndId_Userid(uuid, userId); magicnotifyCart.setDesiredPrice(desiredPrice); // 无需手动save,事务提交时JPA会自动同步修改 // cartRepository.save(magicnotifyCart); }
更高效的方案:直接执行更新语句
如果不需要先查询实体,推荐用JPQL直接执行更新操作,避免额外的数据库查询:
// 在Repository接口中定义 public interface MagicnotifyCartRepository extends JpaRepository<MagicnotifyCart, MagicnotifyCartId> { @Modifying @Transactional @Query("UPDATE MagicnotifyCart c SET c.desiredPrice = :desiredPrice WHERE c.id.uuid = :uuid AND c.id.userid = :userId") int updateDesiredPrice(@Param("desiredPrice") BigDecimal desiredPrice, @Param("uuid") String uuid, @Param("userId") Long userId); }
调用时直接执行该方法,返回值为受影响的行数。
内容的提问来源于stack exchange,提问作者hanaglitched
相关产品推荐
相关产品推荐

