从两个视图中获取相同的对象
Getting same object from two views
我有树模型 'cinema'、'cinemaHall' 和 'seo',其中 'cinema' 与 @OneToMany 与 'cinemaHall' 有关系。此外,'cinema' 和 'cinemaHall' 模型与 @OneToOne 和 'seo' 之间存在关系。问题出在模型 seo 中。在创建 'cinema' 和 'cinemaHall' 之后,我得到了来自 Thymeleaf 的相同 'seo',它与 'cinema' 相关。但是我需要为 'cinemaHall' 接收 'seo'(例如,id = 2)。求大家截图理解。
CinemaController.java:
...
@PutMapping("update/{cinemaId}")
public String updateCinema(@PathVariable("cinemaId") Long cinemaId,
@ModelAttribute("cinema") Cinema cinema,
@ModelAttribute("seo") SEO seo){
cinema.setSeo(seo);
cinemaService.updateCinema(cinema);
return "redirect:/admin/cinemas";
}
...
@PutMapping("edit/{cinemaId}/halls/update/{hallId}")
public String updateCinemaHall(@PathVariable("cinemaId") Long cinemaId,
@PathVariable("hallId") Long hallId,
@ModelAttribute("cinemaHall") CinemaHall cinemaHall,
@ModelAttribute("seo") SEO seo){
cinemaHall.setSeo(seo);
cinemaHallService.updateCinemaHall(cinemaHall);
return "redirect:/admin/cinemas/edit/" + cinemaId;
}
...
Cinema.java
...
@OneToMany
@JoinColumn(name="cinema_id", referencedColumnName="id")
private List<CinemaHall> cinemaHallList = new ArrayList<>();
@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "seo_id")
private SEO seo;
...
CinemaHall.java
...
@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "seo_id")
private SEO seo;
...
SEO.java
@Getter
@Setter
@NoArgsConstructor
@Entity
@Table(name = "seo")
public class SEO extends MappedEntity {
@Column
private String url;
@Column
private String title;
@Column
private String keywords;
@Column(name = "seo_description")
private String seoDescription;
}
例如,在创建 cinema(id=1) 和 seo(id=1) 之后,我正在尝试创建 cinemaHall(id=1),同时也成功创建了 seo(id=2),但是之后应用用于保存 cinemaHall 的操作 我正在接收 id=1 的 seo 和来自 id=2 的类似字段。
Look at seo which has id=1, but should be id=2
实际上你给定的关系不工作possibility.because A 到 B 的关系很好,A 到 C 或 B 到 C 任何一种关系只可能两者都不可能。
A 和 B 都需要与 C 的关系,然后不需要 A 到 B relationship.If B 与 C 有关系,然后 A 可以从相应的 B 对象访问 C 对象。
如果你在 cinema 和 seo 之间以及 cinemaHall 和 seo 之间有一对一的映射,你就不需要 cinema 和 cinemaHall 之间的一对多映射。
只需使用一对一映射,这应该可以解决您的问题。
我有树模型 'cinema'、'cinemaHall' 和 'seo',其中 'cinema' 与 @OneToMany 与 'cinemaHall' 有关系。此外,'cinema' 和 'cinemaHall' 模型与 @OneToOne 和 'seo' 之间存在关系。问题出在模型 seo 中。在创建 'cinema' 和 'cinemaHall' 之后,我得到了来自 Thymeleaf 的相同 'seo',它与 'cinema' 相关。但是我需要为 'cinemaHall' 接收 'seo'(例如,id = 2)。求大家截图理解。
CinemaController.java:
...
@PutMapping("update/{cinemaId}")
public String updateCinema(@PathVariable("cinemaId") Long cinemaId,
@ModelAttribute("cinema") Cinema cinema,
@ModelAttribute("seo") SEO seo){
cinema.setSeo(seo);
cinemaService.updateCinema(cinema);
return "redirect:/admin/cinemas";
}
...
@PutMapping("edit/{cinemaId}/halls/update/{hallId}")
public String updateCinemaHall(@PathVariable("cinemaId") Long cinemaId,
@PathVariable("hallId") Long hallId,
@ModelAttribute("cinemaHall") CinemaHall cinemaHall,
@ModelAttribute("seo") SEO seo){
cinemaHall.setSeo(seo);
cinemaHallService.updateCinemaHall(cinemaHall);
return "redirect:/admin/cinemas/edit/" + cinemaId;
}
...
Cinema.java
...
@OneToMany
@JoinColumn(name="cinema_id", referencedColumnName="id")
private List<CinemaHall> cinemaHallList = new ArrayList<>();
@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "seo_id")
private SEO seo;
...
CinemaHall.java
...
@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "seo_id")
private SEO seo;
...
SEO.java
@Getter
@Setter
@NoArgsConstructor
@Entity
@Table(name = "seo")
public class SEO extends MappedEntity {
@Column
private String url;
@Column
private String title;
@Column
private String keywords;
@Column(name = "seo_description")
private String seoDescription;
}
例如,在创建 cinema(id=1) 和 seo(id=1) 之后,我正在尝试创建 cinemaHall(id=1),同时也成功创建了 seo(id=2),但是之后应用用于保存 cinemaHall 的操作 我正在接收 id=1 的 seo 和来自 id=2 的类似字段。 Look at seo which has id=1, but should be id=2
实际上你给定的关系不工作possibility.because A 到 B 的关系很好,A 到 C 或 B 到 C 任何一种关系只可能两者都不可能。
A 和 B 都需要与 C 的关系,然后不需要 A 到 B relationship.If B 与 C 有关系,然后 A 可以从相应的 B 对象访问 C 对象。
如果你在 cinema 和 seo 之间以及 cinemaHall 和 seo 之间有一对一的映射,你就不需要 cinema 和 cinemaHall 之间的一对多映射。
只需使用一对一映射,这应该可以解决您的问题。