在Spring Boot中如何更新具有OneToMany关系的字段

问题描述 投票:0回答:1

我是 Spring Boot 新手。我正在尝试做一些例子来学习。

我有 2 个用户“个人资料”和“地址”的权利。 配置文件可以有多个地址。

public class Address {

    @Id
    private UUID id;


    private boolean primaryAddress;
}

和个人资料

@Entity
public class UserProfile {

    @Id
    private UUID id;


    @OneToMany(
            fetch = FetchType.EAGER, orphanRemoval = true, cascade = CascadeType.REMOVE
    )
    @JoinColumn(
            name = "profile_id",
            foreignKey = @ForeignKey(name = "fk_address_userprofile")
    )
    private Set<Address> addressList = new HashSet<>();


}

当用户输入地址时,如果它是主地址,我需要将该用户的所有其他地址的primaryAddress字段设置为false

我遇到的问题是在我的地址存储库中如何编写此查询。我尝试了本机查询,但它似乎不起作用。

@Repository
public interface AddressRepository extends JpaRepository<Address, UUID> {

    @Modifying
    //@Query(value = "UPDATE Address SET primary_address = false WHERE profile_id = ?1", nativeQuery = true)
    @Query("UPDATE Address SET primaryAddress=false where UserProfile.id = ?1 ")
    void resetPrimaryByUserProfileId(UUID userProfileId);
}

任何人都可以提供一些关于如何执行此操作的帮助吗?

spring-boot sql-update one-to-many
1个回答
0
投票

使用 ORM 的要点是允许我们使用 OOP 技术来更新数据库表。所以你可以用OOP的方式来思考,只需将需要的

Address
对象更新到正确的状态,然后让hibernate找出更新SQL是什么,而不是手动编写更新SQL。

所以你可以做类似的事情:

@Entity
public class UserProfile {

   public void addAddress(Address addr){

      if(addr.primaryAddress){
         addressList.forEach(addr->addr.setPrimaryAddress(false));
      }
   }
}
UserProfile userProfile = userProfileRepository.getById(1);
userPrfile.addAddress(someAddress);

顺便说一下,我有以下代码审查意见:

  • FetchType.EAGER
    是一个坏主意
  • 将一对多映射为双向可能会更
  • 高效
© www.soinside.com 2019 - 2024. All rights reserved.