java - 无法使用休眠在同一 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>
解决方案
推荐阅读
- python - 如何构建数据框,而不仅仅是从 for 循环中打印列表?
- python - Python。pytz 和 datetime.astimezone 的行为不符合预期
- python - 使用 Python (xlwings) 将 excel doc 中的特定工作表打印为 PDF
- python - 使用梯形方法集成 SciPy 问题('numpy.ndarray' 对象不可调用)
- r - 将变音符号保存在 R 中的 .csv 中
- excel - Excel - 将文本反转为列
- c# - 调用 transform.Translate 时播放器不移动
- postgresql - 使用 GORM 从 JoinTable 获取具有顺序的关联对象
- wildcard - Snakemake 在新规则中指定新通配符
- python - 如何从主函数返回字符串?