英文:
insert with one to many relation spring boot
问题
以下是翻译好的内容:
显示表单控制器
@GetMapping("/add-tour-package")
public String showAddPackageForm(Model model) {
TourPackage tourPackage = new TourPackage();
Itinerary itinerary = new Itinerary();
model.addAttribute("tourPackage", tourPackage);
model.addAttribute("itinerary", itinerary);
return "new-tour-package";
}
插入旅游套餐
@PostMapping("/save-tour-package")
public String saveTourPackage(@ModelAttribute("tourPackage") TourPackage tourPackage, @ModelAttribute("itinerary") Itinerary itinerary) {
// 将套餐保存到数据库
tourPackageService.saveTourPackage(tourPackage);
return "redirect:/";
}
动态字段的表单。注意行程是动态输入字段,因此会有多个行程。
<form th:action="@{/save-tour-package}" th:object="${tourPackage}" method="POST">
<!-- 表单字段省略... -->
<div class="row append-new-field">
<!-- 动态行程字段省略... -->
</div>
<div class="row delete-field">
<!-- 删除行程字段省略... -->
</div>
<a href="javascript:;" onclick="addItineraryFields()" class="text-success">Add Fields</a>
<div class="form-group">
<button type="submit" class="btn btn-info col-2"> Save Tour Package</button>
</div>
</form>
行程模型
@Entity
@Table(name = "itinerary")
@EntityListeners(AuditingEntityListener.class)
public class Itinerary {
// 表字段和关联省略...
}
旅游套餐模型
@Entity
@Table(name = "tour_package")
@EntityListeners(AuditingEntityListener.class)
public class TourPackage {
// 表字段和关联省略...
}
TourPackage保存功能
@Override
public long saveTourPackage(TourPackage tourPackage) {
this.tourPackagesRepo.save(tourPackage);
return 0;
}
Itinerary保存功能
@Override
public long saveItinerary(Itinerary itinerary) {
this.itineraryRepo.save(itinerary);
return 0;
}
注意:上述代码只是翻译成中文,具体的功能和逻辑涉及到Spring Boot框架和数据库操作等,需要确保代码在适当的上下文中运行才能实现预期的功能。
英文:
What i have is single page to get all the fields with its relations data.
What i want to achieve is insert Package and then insert its related iteneraries at the same time.
How do I do this? Please comment if any thing is missing that I must add to the question.
display form controller
@GetMapping("/add-tour-package")
public String showAddPackageForm(Model model) {
TourPackage tourPackage = new TourPackage();
Itinerary itinerary = new Itinerary();
model.addAttribute("tourPackage", tourPackage);
model.addAttribute("itinerary", itinerary);
return "new-tour-package";
}
Insert Tour package
@PostMapping("/save-tour-package")
public String saveTourPackage(@ModelAttribute("tourPackage") TourPackage tourPackage, @ModelAttribute("itinerary") Itinerary itinerary) {
// save package to database
tourPackageService.saveTourPackage(tourPackage);
return "redirect:/";
}
form with dynamic fields. Note that itinerary is dynamic input fields so there will be multiple itinerary.
<form th:action="@{/save-tour-package}" th:object="${tourPackage}" method="POST">
<div class="form-group">
<div class="form-group">
<label for="title">Title</label>
<input type="text" class="form-control" id="title" th:field="*{title}" placeholder="Title">
</div>
<div class="form-group">
<label for="description">Description</label>
<textarea class="form-control" id="description" th:field="*{description}"
placeholder="Description"></textarea>
</div>
<div class="row">
<div class="col-3">
<div class="form-group">
<label for="geography">Geography</label>
<input type="text" class="form-control" id="geography" th:field="*{geography}"
placeholder="Geography">
</div>
</div>
<div class="col-3">
<div class="form-group">
<label for="location">Location</label>
<input type="text" class="form-control" id="location" th:field="*{location}"
placeholder="Location">
</div>
</div>
<div class="col-3">
<div class="form-group">
<label for="difficulty">Difficulty</label>
<input type="text" class="form-control" id="difficulty" th:field="*{difficulty}"
placeholder="Difficulty">
</div>
</div>
<div class="col-3">
<div class="form-group">
<label for="altitude">Altitude</label>
<input type="text" class="form-control" id="altitude" th:field="*{altitude}"
placeholder="Altitude">
</div>
</div>
<div class="col-3">
<div class="form-group">
<label for="religion">Religion</label>
<input type="text" class="form-control" id="religion" th:field="*{religion}"
placeholder="Title">
</div>
</div>
<div class="col-3">
<div class="form-group">
<label for="ethnic_people">Ethnic People</label>
<input type="text" class="form-control" id="ethnic_people" th:field="*{ethnic_people}"
placeholder="Ethnic People">
</div>
</div>
<div class="col-3">
<div class="form-group">
<label for="accommodation">Accommodation</label>
<input type="text" class="form-control" id="accommodation" th:field="*{accommodation}"
placeholder="Title">
</div>
</div>
<div class="col-3">
<div class="form-group">
<label for="transportation">Transportation</label>
<input type="text" class="form-control" id="transportation" th:field="*{transportation}"
placeholder="Transportation">
</div>
</div>
<div class="col-3">
<div class="form-group">
<label for="minimum_pax">Minimum Pax</label>
<input type="text" class="form-control" id="minimum_pax" th:field="*{minimum_pax}"
placeholder="Minimum Pax">
</div>
</div>
<div class="col-3">
<div class="form-group">
<label for="price">Price</label>
<input type="text" class="form-control" id="price" th:field="*{price}" placeholder="Price">
</div>
</div>
</div>
<div class="row append-new-field">
<div class="col-2">Day</div>
<div class="col-3">Title</div>
<div class="col-3">Description</div>
<div class="col-3">Altitude</div>
<div class="col-1"></div>
</div>
<div class="row delete-field">
<div class="col-2">
<input type="text" class="form-control" th:name="${itinerary.day}">
</div>
<div class="col-3">
<input type="text" class="form-control" th:name="${itinerary.title}">
</div>
<div class="col-3">
<input type="text" class="form-control" th:name="${itinerary.description}">
</div>
<div class="col-3">
<input type="text" class="form-control" th:name="${itinerary.altitude}">
</div>
<div class="col-1">
<a href="javascript:;" class="text-danger delete-row"><i class="fas fa-minus-circle"></i></a>
</div>
</div>
<a href="javascript:;" onclick="addItineraryFields()" class="text-success">Add Fields</a>
<div class="form-group">
<button type="submit" class="btn btn-info col-2"> Save Tour Package</button>
</div>
</div>
</form>
Itinerary model
package com.pristine.travels.model;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import java.util.Date;
import java.util.Objects;
@Entity
@Table(name = "itinerary")
@EntityListeners(AuditingEntityListener.class)
public class Itinerary {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String day;
private String title;
private String description;
private String altitude;
private String duration;
@Temporal(TemporalType.TIMESTAMP)
@CreatedDate
private Date added_date;
@Temporal(TemporalType.TIMESTAMP)
@LastModifiedDate
private Date update_date;
@ManyToOne
@JoinColumn(name="packages_id")
private TourPackage packages;
public Itinerary() {
}
public Itinerary(long id, String day, String title, String description, String altitude, String duration, Date added_date, Date update_date, TourPackage packages) {
this.id = id;
this.day = day;
this.title = title;
this.description = description;
this.altitude = altitude;
this.duration = duration;
this.added_date = added_date;
this.update_date = update_date;
this.packages = packages;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getDay() {
return day;
}
public void setDay(String day) {
this.day = day;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getAltitude() {
return altitude;
}
public void setAltitude(String altitude) {
this.altitude = altitude;
}
public String getDuration() {
return duration;
}
public void setDuration(String duration) {
this.duration = duration;
}
public Date getAdded_date() {
return added_date;
}
public void setAdded_date(Date added_date) {
this.added_date = added_date;
}
public Date getUpdate_date() {
return update_date;
}
public void setUpdate_date(Date update_date) {
this.update_date = update_date;
}
public TourPackage getPackages() {
return packages;
}
public void setPackages(TourPackage packages) {
this.packages = packages;
}
@Override
public String toString() {
return "Itinerary{" +
"id=" + id +
", day='" + day + '\'' +
", title='" + title + '\'' +
", description='" + description + '\'' +
", altitude='" + altitude + '\'' +
", duration='" + duration + '\'' +
", added_date=" + added_date +
", update_date=" + update_date +
", packages=" + packages +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Itinerary itinerary = (Itinerary) o;
return id == itinerary.id;
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
Tour package model
package com.pristine.travels.model;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import java.util.Date;
import java.util.Objects;
import java.util.Set;
@Entity
@Table(name = "tour_package")
@EntityListeners(AuditingEntityListener.class)
public class TourPackage {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String title;
private String description;
private String geography;
private String location;
private String difficulty;
private String altitude;
private String religion;
private String ethnic_people;
private String accommodation;
private String transportation;
private String minimum_pax;
private Integer price;
@Temporal(TemporalType.TIMESTAMP)
@CreatedDate
private Date added_date;
@Temporal(TemporalType.TIMESTAMP)
@LastModifiedDate
private Date update_date;
@OneToMany(mappedBy = "packages")
private Set<Itinerary> itineraries;
public TourPackage() {
}
public TourPackage(long id, String title, String description, String geography, String location, String difficulty, String altitude, String religion, String ethnic_people, String accommodation, String transportation, String minimum_pax, Integer price, Date added_date, Date update_date, Set<Itinerary> itineraries) {
this.id = id;
this.title = title;
this.description = description;
this.geography = geography;
this.location = location;
this.difficulty = difficulty;
this.altitude = altitude;
this.religion = religion;
this.ethnic_people = ethnic_people;
this.accommodation = accommodation;
this.transportation = transportation;
this.minimum_pax = minimum_pax;
this.price = price;
this.added_date = added_date;
this.update_date = update_date;
this.itineraries = itineraries;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getGeography() {
return geography;
}
public void setGeography(String geography) {
this.geography = geography;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String getDifficulty() {
return difficulty;
}
public void setDifficulty(String difficulty) {
this.difficulty = difficulty;
}
public String getAltitude() {
return altitude;
}
public void setAltitude(String altitude) {
this.altitude = altitude;
}
public String getReligion() {
return religion;
}
public void setReligion(String religion) {
this.religion = religion;
}
public String getEthnic_people() {
return ethnic_people;
}
public void setEthnic_people(String ethnic_people) {
this.ethnic_people = ethnic_people;
}
public String getAccommodation() {
return accommodation;
}
public void setAccommodation(String accommodation) {
this.accommodation = accommodation;
}
public String getTransportation() {
return transportation;
}
public void setTransportation(String transportation) {
this.transportation = transportation;
}
public String getMinimum_pax() {
return minimum_pax;
}
public void setMinimum_pax(String minimum_pax) {
this.minimum_pax = minimum_pax;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
public Date getAdded_date() {
return added_date;
}
public void setAdded_date(Date added_date) {
this.added_date = added_date;
}
public Date getUpdate_date() {
return update_date;
}
public void setUpdate_date(Date update_date) {
this.update_date = update_date;
}
public Set<Itinerary> getItineraries() {
return itineraries;
}
public void setItineraries(Set<Itinerary> itineraries) {
this.itineraries = itineraries;
}
@Override
public String toString() {
return "TourPackage{" +
"id=" + id +
", title='" + title + '\'' +
", description=" + description +
", geography='" + geography + '\'' +
", location='" + location + '\'' +
", difficulty='" + difficulty + '\'' +
", altitude='" + altitude + '\'' +
", religion='" + religion + '\'' +
", ethnic_people='" + ethnic_people + '\'' +
", accommodation='" + accommodation + '\'' +
", transportation='" + transportation + '\'' +
", minimum_pax='" + minimum_pax + '\'' +
", price=" + price +
", added_date=" + added_date +
", update_date=" + update_date +
", itineraries=" + itineraries +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
TourPackage that = (TourPackage) o;
return id == that.id;
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
UPDATE
TourPackage save function
@Override
public long saveTourPackage(TourPackage tourPackage) {
this.tourPackagesRepo.save(tourPackage);
return 0;
}
Itinerary save function
@Override
public long saveItinerary(Itinerary itinerary) {
this.itineraryRepo.save(itinerary);
return 0;
}
答案1
得分: 0
在执行 tourPackageService.saveTourPackage(tourPackage);
之前,先为该 tourPackage 设置行程:tourPackage.setItineraries(itinerary);
。确保对于行程也进行相同的操作(在 tourPackage.setItineraries(itinerary);
之前):
itinerary.forEach(item -> { item.setTourPackage(tourPackage); }
然后执行 tourPackageService.saveTourPackage(tourPackage);
英文:
Before doing tourPackageService.saveTourPackage(tourPackage);
just set Itineraries for that tourPackage: tourPackage.setItineraries(itinerary);
. Make sure you do the same for Itineraries (before tourPackage.setItineraries(itinerary);
):
> itinerary.forEach(item -> { item.setTourPackage(tourPackage); }
then do tourPackageService.saveTourPackage(tourPackage);
专注分享java语言的经验与见解,让所有开发者获益!
评论