Я относительно новичок в Java Spring MVC и работаю над веб-приложением, в котором перечислены шампуни и их ингредиенты.Я думаю, что я что-то неправильно понимаю.Я попытаюсь объяснить ситуацию, если у вас возникнут вопросы, дайте мне знать.
Проблема, с которой я сейчас сталкиваюсь, состоит в том, чтобы выяснить, как управлять информацией, вводимой пользователем в форму;в частности, раскрывающееся меню (множественный выбор).
В базе данных Ingredient уже есть более 1000 записей, и, скорее всего, она больше не понадобится в ближайшее время.Пользователь сможет добавлять новые типы шампуней, но не сможет добавлять новые ингредиенты.У меня уже есть стол, полный разных ингредиентов.Проблема в том, что когда я выбираю ингредиенты, которые принадлежат шампуню в форме, и нажимаю «Отправить», он снова вставляет эти данные в таблицу. Это img фактических записей таблицы. Как вы можете видеть, он добавляет записи типа 8,33,62,18 .. Когда вместо этого добавляется это в таблицу Shampoo_Ingredients. Это изображение Shampoo_Ingredient.Как видите, он использует ключ вновь вставленного ингредиента вместо того, чтобы выбирать ингредиент, выбранный пользователем напрямую.
DB Image
JSPFile
<form:form cssClass="form" action="saveShampoo" modelAttribute="shampoo" method="POST">
<table>
<tbody>
<tr>
<td><label>Name:</label></td>
<td><form:input path="name" /></td>
</tr>
<tr>
<td><label>Company:</label></td>
<td><form:input path="company" /></td>
</tr>
<tr>
<td><label>Ingredients:</label></td>
<td><form:select cssClass="test" multiple="true" path="ingredients" >
<form:options items="${ingredients}" itemLabel="name" itemValue="id" />
<td>${ingredient.name}</td>
</form:select></td>
</tr>
</tbody>
</table>
<input id= "submit" type="submit" value="Save"/>
</form:form
Контроллер File
@GetMapping("/showFormForAdd")
public String showFormForAdd(Model theModel, ModelMap modelMap) {
//create model attribute to bind form data
Shampoo theShampoo = new Shampoo();
modelMap.addAttribute("shampoo", theShampoo);
List<Ingredient> theIngredients = ingredientDAO.getIngredients();
theModel.addAttribute("ingredients", theIngredients);
return "shampoo-form";
}
@PostMapping("/saveShampoo")
public String saveShampoo(@ModelAttribute("shampoo") Shampoo theShampoo) {
System.out.println(theShampoo.getIngredients());
shampooDAO.saveShampoo(theShampoo);
return "redirect:/shampoo/list";
}
}
Entity File
@Entity
@Table(name="shampoo")
public class Shampoo {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY )
@Column(name="shampoo_id")
private int id;
@Column(name="shampoo_name")
private String name;
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="shampoo_company")
private Company company;
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(
name="shampoo_ingredients",
joinColumns=@JoinColumn(name="fk_shampoo"),
inverseJoinColumns=@JoinColumn(name="fk_ingredient")
)
private List<Ingredient> ingredients;
public Shampoo() {
}
public Shampoo(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Company getCompany() {
return company;
}
public void setCompany(Company company) {
this.company = company;
}
public List<Ingredient> getIngredients() {
return ingredients;
}
public void setIngredients(List<Ingredient> ingredients) {
this.ingredients = ingredients;
}
@Override
public String toString() {
return "Shampoo [id=" + id + ", name=" + name + ", company=" + company + "]";
}
Шампунь DAO
@Repository
public class ShampooDAOImpl implements ShampooDAO {
@Autowired
private SessionFactory sessionFactory;
@Transactional
public List<Shampoo> getShampoos() {
//get current hibernate session
Session currentSession = sessionFactory.getCurrentSession();
//create query
Query<Shampoo> theQuery = currentSession.createQuery("from Shampoo", Shampoo.class);
//execute query and get result list
List<Shampoo> shampoos = theQuery.getResultList();
//return list of shampoo
return shampoos;
}
@Transactional
public void saveShampoo(Shampoo theShampoo) {
Session currentSession = sessionFactory.getCurrentSession();
currentSession.save(theShampoo);
}
}
Ингредиент Entity
@Entity
@Table(name="ingredient")
public class Ingredient {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ingredient_id")
private int id;
@Column(name="ingredient_name")
private String name;
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(
name="shampoo_ingredients",
joinColumns=@JoinColumn(name="fk_ingredient"),
inverseJoinColumns=@JoinColumn(name="fk_shampoo")
)
private List<Shampoo> Shampoo;
public Ingredient() {
}
public Ingredient(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Shampoo> getShampoo() {
return Shampoo;
}
public void setShampoo(List<Shampoo> shampoo) {
Shampoo = shampoo;
}
@Override
public String toString() {
return "Ingredient [id=" + id + ", name=" + name + "]";
}