Spring MVP表单在更新对象时覆盖多对多数组列表



我有一个简单的项目,它有一个用户模型,体育团队模型和一个多对多表,用户可以在其中"点赞"。运动队。

用户

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(
name = "likes", 
joinColumns = @JoinColumn(name = "user_id"), 
inverseJoinColumns = @JoinColumn(name = "team_id")
)
private List<Team> teamsLiked;

团队
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank
@Size(min=2, max=30)
private String teamName;
@NotBlank
private String city;
private String sport;    
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(
name = "likes", 
joinColumns = @JoinColumn(name = "team_id"), 
inverseJoinColumns = @JoinColumn(name = "user_id")
)
private List<User> likers;

我的问题是,当我使用Spring MVC表单让用户编辑团队时,在提交时,它完全删除了喜欢器下team对象上现有的喜欢。在编辑页面上,我使用@ModelAttribute并预填充现有的团队对象,并尝试将喜欢者作为隐藏属性,以便数据将持续存在,但这会抛出一个错误。我在@PostMapping后端尝试过,在重新保存DB之前设置喜欢者的起源列表,这也不起作用。除了使用普通的HTML表单来更新对象,有没有一种方法可以让喜欢一个团队的用户列表在更新后持续存在?提前谢谢。

这里需要的是DTO并将其映射到现有实体。我认为这是火焰持久实体视图的完美用例。

我创建的库允许JPA模型和自定义接口或抽象类定义模型之间的轻松映射,类似于类固醇上的Spring Data projection。其思想是,您以您喜欢的方式定义您的目标结构(域模型),并通过JPQL表达式将属性(getter)映射到实体模型。

您的用例的DTO模型可以像下面这样使用Blaze-Persistence Entity-Views:

@EntityView(Team.class)
@UpdatableEntityView
public interface TeamDto {
@IdMapping
Long getId();
String getTeamName();
void setTeamName(String teamName);
String getCity();
void setCity(String city);
String getSport();
void setSport(String sport);
}

查询是将实体视图应用于查询的问题,最简单的就是通过id进行查询。

TeamDto a = entityViewManager.find(entityManager, TeamDto.class, id);

Spring Data集成允许您几乎像Spring Data projection一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features

Page<TeamDto> findAll(Pageable pageable);

最好的部分是,它只会获取实际需要的状态!

在保存数据的情况下,您可以使用Spring WebMvc集成它看起来像下面这样:

@Transactional
@PostMapping("/teams")
void save(@RequestBody TeamDto dto){
repository.save(dto);
}

最新更新