【问题标题】:How to create java spring-mvc form with hibernate @OneToOne,@ManyToOne... annotations with @ModelAttribute如何使用休眠 @OneToOne、@ManyToOne... 使用 @ModelAttribute 注释创建 java spring-mvc 表单
【发布时间】:2019-12-20 13:37:31
【问题描述】:

我想用@ModelAttribute 创建一个控制器,它允许我将数据插入到我的客户表中。我已经与员工一起完成了一项工作,但是如何使用@ModelAttribute 以 JSP 形式保存两个休眠映射实体?另外,我正在使用带有 JpaRepository 接口的基本生成的存储库。我想让这两个实体关联起来保存它。

我尝试制作@ModelAttribute JSP 表单,但我不知道如何设置其他表实体。

员工

@Entity
@Table
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String firstName;

    private String lastName;

    @Digits(integer = 10, fraction = 0, message = "Must be a digit")
    private Integer age;

    private BigDecimal salary;

    @Temporal(TemporalType.DATE)
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @PastOrPresent(message = "Date must be past or present")
    private Date birthDate;

    @Temporal(TemporalType.DATE)
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @PastOrPresent(message = "Date must be past or present")
    private Date hireDate;

    private boolean sex; //false - woman, true - man

    @OneToOne(mappedBy = "employee")
    private Address address;

    public Employee() {

    }

    public Employee(String firstName, String lastName, Integer age, BigDecimal salary, Date birthDate, Date hireDate,
            boolean sex) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
        this.salary = salary;
        this.birthDate = birthDate;
        this.hireDate = hireDate;
        this.sex = sex;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public BigDecimal getSalary() {
        return salary;
    }

    public void setSalary(BigDecimal salary) {
        this.salary = salary;
    }

    public Date getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }

    public Date getHireDate() {
        return hireDate;
    }

    public void setHireDate(Date hireDate) {
        this.hireDate = hireDate;
    }

    public boolean isSex() {
        return sex;
    }

    public void setSex(boolean sex) {
        this.sex = sex;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

}

地址

@Entity
@Table
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String country;

    private String city;

    private String street;

    private Integer houseNumber;

    private Integer local;

    private String postalCode;

    @OneToOne
    @JoinColumn(name = "employee_id")
    private Employee employee;

    public Address() {

    }

    public Address(String country, String city, String street, Integer houseNumber, Integer local, String postalCode) {
        this.country = country;
        this.city = city;
        this.street = street;
        this.houseNumber = houseNumber;
        this.local = local;
        this.postalCode = postalCode;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public Integer getHouseNumber() {
        return houseNumber;
    }

    public void setHouseNumber(Integer houseNumber) {
        this.houseNumber = houseNumber;
    }

    public Integer getLocal() {
        return local;
    }

    public void setLocal(Integer local) {
        this.local = local;
    }

    public String getPostalCode() {
        return postalCode;
    }

    public void setPostalCode(String postalCode) {
        this.postalCode = postalCode;
    }

    public Employee getEmployee() {
        return employee;
    }

    public void setEmployee(Employee employee) {
        this.employee = employee;
    }

}

控制器

@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    public EmployeeService employeeService;

    @Autowired
    public AddressService addressService;

    @GetMapping("/add")
    public String addUser(Model model) {
        model.addAttribute("employee", new Employee());
        return "user/addEmployee";
    }

    @PostMapping("/add")
    public String postAddUser(@Valid @ModelAttribute("employee") Employee employee, BindingResult bs) { 
        if(bs.hasErrors()) {
            return "user/addAddress";
        } else {
            employeeService.saveOrUpdate(employee);
            return "user/success";

        }
    }

    @GetMapping("/address/add")
    public String addAddress(Model model) {
        List<Employee> employees = employeeService.findAll();

        model.addAttribute("employees", employees);
        model.addAttribute("address", new Address());
        return "user/addAddress";
    }

    @PostMapping("/address/add")
    public String postAddAddress(@ModelAttribute("address") Address address, @RequestParam("employee_id") Long id) {

        Employee employee = employeeService.findById(id);
        address.setEmployee(employee);
        employee.setAddress(address);

        addressService.saveOrUpdate(address);
        employeeService.saveOrUpdate(employee);


        return "user/addAddress";
    }
}

addAddress.jsp

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<html>

    <head></head>

    <body>

        <h2>Address Form</h2>

        <form:form action="/user/address/add" method="POST" modelAttribute="address">
            City: <form:input path="city"/><br>
            Street: <form:input path="street" /><br>
            House Number: <form:input path="houseNumber"/><br>
            Local: <form:input path="local"/><br>
            Postal Code: <form:input path="postalCode" /><br>

            <select name="employee_id">
                <c:forEach var="employee" items="${employees}">
                    <option value="${employee.id}">${employee.id} ${employee.firstName} ${employee.lastName}</option>
                </c:forEach>
            </select><br>

            <input type="submit" />
        </form:form>
    </body>
</html>

addEmployee.jsp

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<html>

    <head></head>

    <body>

        <h2>Employee Form</h2>

        <form:form action="/user/add" method="POST" modelAttribute="employee">
            First Name: <form:input path="firstName"/> <form:errors path="firstName"></form:errors><br>
            Last Name: <form:input path="lastName"/> <form:errors path="lastName"></form:errors><br>
            Age: <form:input path="age" /> <form:errors path="age" type="number"></form:errors><br>
            Salary: <form:input path="salary" type="number"/> <form:errors path="salary"></form:errors><br>
            Birth Date<form:input path="birthDate" type="date"/> <form:errors path="birthDate"></form:errors><br>
            Hire Date<form:input path="hireDate" type="date" /> <form:errors path="hireDate"></form:errors><br>
            Female: <form:radiobutton path="sex" value="0" /> Male: <form:radiobutton path="sex" value="1" /><br>
            <input type="submit" value="Wyślij"/>
        </form:form>
    </body>
</html>

我需要在数据库中创建一个结果,这两个实体使用@ModelAttribute 建立关系。有可能吗?

【问题讨论】:

  • 您是否要为两个实体填写表单,然后在控制器中执行将数据保存到数据库?我对你的理解正确吗? JSP中有代码吗?
  • 是的,我做了两个jsp而不是一个,因为我不知道如何实现它,我会在帖子中更新jsp

标签: spring hibernate spring-boot spring-mvc jsp


【解决方案1】:

如果我正确理解了您的问题, 设置关联实体 -

  1. 您需要具有唯一值来标识实体(例如员工的 Employeeid),
  2. 获取 Employeeid 的详细信息,这将产生员工实体对象
  3. 将员工实体对象设置为客户实体对象

对于发票也是如此。 然后保存客户实体对象。

检查 - https://thoughts-on-java.org/ultimate-guide-association-mappings-jpa-hibernate/

【讨论】:

  • 好的,我做到了,但是休眠允许我为同一个用户创建多个地址,我必须自己编码吗?它不会抛出任何错误?我更新了我的代码,这是做这种事情的好方法吗?
【解决方案2】:

你可以尝试像这样组合它们:

    <form:form action="add" method="POST" modelAttribute="employee">
               <form:hidden path="id"/>
                First Name: <form:input path="firstName"/> <form:errors path="firstName"></form:errors><br>
                Last Name: <form:input path="lastName"/> <form:errors path="lastName"></form:errors><br>
                Age: <form:input path="age" /> <form:errors path="age" type="number"></form:errors><br>
                Salary: <form:input path="salary" type="number"/> <form:errors path="salary"></form:errors><br>
                Birth Date<form:input path="birthDate" type="date"/> <form:errors path="birthDate"></form:errors><br>
                Hire Date<form:input path="hireDate" type="date" /> <form:errors path="hireDate"></form:errors><br>
                Female: <form:radiobutton path="sex" value="0" /> Male: <form:radiobutton path="sex" value="1" /><br>

    <form:form action="add" method="POST" modelAttribute="address">
                    <form:hidden path="addressId"/>  // <- need to rename in your entity Address class               
                     City: <form:input path="city"/><br>
                    Street: <form:input path="street" /><br>
                    House Number: <form:input path="houseNumber"/><br>
                    Local: <form:input path="local"/><br>
                    Postal Code: <form:input path="postalCode" /><br>

                    <select name="employee_id">
                        <c:forEach var="employee" items="${employees}">
                            <option value="${employee.id}">${employee.id} ${employee.firstName} ${employee.lastName}</option>
                        </c:forEach>
                    </select><br>

                <input type="submit" value="Submit"/>
                </form:form>
                    <input type="submit" />
                </form:form>

在控制器方法中:

    @PostMapping("/add")
    public String postAdd(@ModelAttribute("employee") @Valid Employee employee
                                BindingResult empBindingResult,
                                @ModelAttribute("address") Address address,
                                BindingResult addressBindingResult) {
// other code
    }

虽然我没有在这个组合中使用单选按钮和选择器元素,但其余代码应该可以正常工作。

Spring MVC Multiple ModelAttribute On the Same Form
Multiple modelattributes in a JSP with Spring

【讨论】:

  • 它看起来不太好:/它有两个提交按钮和嵌套的
    还有其他方法吗? stackoverflow.com/questions/3430214/…
  • 我有一个错字。最后提交按钮就够了
  • 附加发布类似问题
猜你喜欢
  • 2016-08-16
  • 2012-08-11
  • 2023-04-01
  • 1970-01-01
  • 2011-02-25
  • 2012-04-08
  • 2013-12-26
  • 2012-07-30
  • 1970-01-01
相关资源
最近更新 更多