首页 > 解决方案 > 无法使用休眠在同一 JSP 页面上同时保存一对多关系实体

问题描述

我是 Spring 新手,正在尝试构建一个示例应用程序。在这个我有一个公司(OwnerCompany),它可以有多个位置(OwnerCompanyOffices)。我正在尝试使用相同的 JSP 页面同时保存公司及其多个位置。我无法从我的 JSP 页面获取正确的数据到 spring 控制器。我的休眠日志是这样的

OwnerCompanyOffices [id=0, name=null, location=null, ownerCompany=null]
Hibernate: insert into owner_company_offices (location, name, owner_company_id) values (?, ?, ?)

这是我的代码我的 OwnerCompany 实体OwnerCompany.java

package com.sachinmukherjee.spring_hibernate.entity;

import java.util.Set;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "owner_company")
public class OwnerCompany {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name="name")
    private String name;

    @Column(name = "short_name")
    private String short_name;

    @OneToMany(mappedBy = "owner_company",cascade = CascadeType.REMOVE,fetch = FetchType.LAZY)
    private Set<Users>  users;

    @OneToMany(mappedBy = "ownerCompany", cascade = CascadeType.REMOVE, fetch = FetchType.EAGER)
    private List<OwnerCompanyOffices> ownerCompanyOffices;

    public OwnerCompany() {
        super();
        // TODO Auto-generated constructor stub
    }

    public OwnerCompany(String name, String short_name) {
        this.name = name;
        this.short_name = short_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 String getShort_name() {
        return short_name;
    }

    public void setShort_name(String short_name) {
        this.short_name = short_name;
    }

    public Set<Users> getUsers() {
        return users;
    }

    public void setUsers(Set<Users> users) {
        this.users = users;
    }

    public List<OwnerCompanyOffices> getOwnerCompanyOffices() {
        return ownerCompanyOffices;
    }

    public void setOwnerCompanyOffices(List<OwnerCompanyOffices> ownerCompanyOffices) {
        this.ownerCompanyOffices = ownerCompanyOffices;
    }

    @Override
    public String toString() {
        return "OwnerCompany [id=" + id + ", name=" + name + ", short_name=" + short_name + ", users=" + users
                + ", ownerCompanyOffices=" + ownerCompanyOffices + "]";
    }

    public void addOwnerCompanyOffices(OwnerCompanyOffices ownerCompanyOffice) {
        if(ownerCompanyOffices == null) {
            ownerCompanyOffices = new ArrayList<OwnerCompanyOffices>();
        }

        ownerCompanyOffices.add(ownerCompanyOffice);
        ownerCompanyOffice.setOwnerCompany(this);
    }
}

我的 OwnerCompanyOffices 实体OwnerCompanyOffices.java

package com.sachinmukherjee.spring_hibernate.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="owner_company_offices")
public class OwnerCompanyOffices {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name = "name")
    private String name;

    @Column(name="location")
    private String location;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "owner_company_id")
    private OwnerCompany ownerCompany;

    public OwnerCompanyOffices() {
        super();
        // TODO Auto-generated constructor stub
    }

    public OwnerCompanyOffices(String name, String location) {
        this.name = name;
        this.location = location;
    }

    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 String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }

    public OwnerCompany getOwnerCompany() {
        return ownerCompany;
    }

    public void setOwnerCompany(OwnerCompany ownerCompany) {
        this.ownerCompany = ownerCompany;
    }

    @Override
    public String toString() {
        return "OwnerCompanyOffices [id=" + id + ", name=" + name + ", location=" + location + ", ownerCompany="
                + ownerCompany + "]";
    }
}

我的 OwnerCompanyOfficesDAO 类OwnerCompanyOfficesDAOImp

package com.sachinmukherjee.spring_hibernate.dao;

import java.util.List;
import javax.transaction.Transactional;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.sachinmukherjee.spring_hibernate.entity.OwnerCompanyOffices;

@Repository
public class OwnerCompanyOfficesDAOImp implements OwnerCompanyOfficesDAO {

    @Autowired
    SessionFactory sessionFactory;

    public List<OwnerCompanyOffices> getAllOffices() {
        // TODO Auto-generated method stub
        return null;
    }

    @Transactional
    public void saveOffice(OwnerCompanyOffices ownerCompanyOffice) {
        Session session = sessionFactory.getCurrentSession();
        session.saveOrUpdate(ownerCompanyOffice);

    }

}

我的 OwnerCompanyController 类OwnerCompanyController

package com.sachinmukherjee.spring_hibernate.controller;

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.ui.Model;
import com.sachinmukherjee.spring_hibernate.dao.OwnerCompanyDAO;
import com.sachinmukherjee.spring_hibernate.dao.OwnerCompanyOfficesDAO;
import com.sachinmukherjee.spring_hibernate.entity.OwnerCompany;
import com.sachinmukherjee.spring_hibernate.entity.OwnerCompanyOffices;

@Controller
@RequestMapping("/owner_company/")
public class OwnerCompanyController {

    @Autowired
    private OwnerCompanyDAO ownerCompanyDAO;

    @Autowired
    private OwnerCompanyOfficesDAO ownerCompanyOfficesDAO;

    @GetMapping("/add/")
    public String add(Model model) {
        OwnerCompanyOffices ownerCompanyOffices = new OwnerCompanyOffices();
        model.addAttribute("ownerCompanyOffices", ownerCompanyOffices);
        return "owner_company/add";
    }

    @PostMapping("/submit")
    public String submit(@ModelAttribute("ownerCompanyOffices") OwnerCompanyOffices ownerCompanyOffices) {
        System.out.println(ownerCompanyOffices);
        ownerCompanyOfficesDAO.saveOffice(ownerCompanyOffices);
        return "redirect:/owner_company/";
    }
}

我在其中输入 ownercompany 和 ownercompanyoffices 数据的 add.jsp 页面

<div class="row">
     <div class="col-md-12">
        <form action="${pageContext.request.contextPath}/owner_company/submit/" method="POST" modelAttribute="ownerCompanyOffices" class="form-control">
            <label>Name</label>
            <input name="ownerCompanyOffices.ownerCompany.name" required="required"/>
            </br></br>
            <label>Short Name</label>
            <input name="ownerCompanyOffices.ownerCompany.short_name" type="text" />
            </br></br>
        <table class="table table-responsive">
          <thead>
            <tr>
                <th>Name</th>
                <th>Location</th>
                <th>Action</th>
            </tr>
            </thead>
            <tbody>
                <tr class="toClone">
                    <td><input type="text" name="ownerCompanyOffices.name" required="required"/></td>
                    <td><input type="text" name="ownerCompanyOffices.location" required="required"/></td>
                    <td class="remove"></td>
                </tr>
                <tr id="addRow">
                    <td></td>
                    <td></td>
                    <td><a href="#" class="addMore">Add More</a>
                </tr>
            </tbody>
        </table>
        <button type="submit" class="btn btn-success">Save</button>
        </form>
      </div>

     </div>
</body>
</html>
<script type="text/javascript">
$(document).on("click",".addMore", function(){
        var clonedRow = $(".toClone:first").clone();
        $(clonedRow).find("input").each(function(){
            $(this).val("");
        });
        $(clonedRow).addClass("toRemove");
        $(clonedRow).find(".remove").addClass("removeRow");
        $(clonedRow).find(".remove").html("<a href='#'>Remove</a>");
        $(clonedRow).insertBefore($("#addRow"));

});

$(document).on("click",".removeRow", function(){
        $(this).closest("tr").remove();
});
</script>

截屏 在这里,通过单击添加更多链接,用户可以针对单个公司添加多个办事处。

标签: javaspringhibernatespring-mvcjsp

解决方案


推荐阅读