Как контролировать, должен ли Hibernate вставляться в таблицу? - PullRequest
0 голосов
/ 26 декабря 2018

Я относительно новичок в 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 + "]";
    }
...