【问题标题】:Spring Hibernate One-To-One relationship creates new record on child table instead of updateSpring Hibernate 一对一关系在子表上创建新记录而不是更新
【发布时间】:2017-06-29 06:15:06
【问题描述】:

我是 Spring 新手,仍在学习 Hibernate 一对一关系。我有这个问题,每当我更新特定记录时,它都会为子表创建一个新记录,并且我的所有者表中的外键也会更新。我期望的是两个连接表的记录只会更新。

这里有一些代码:

Employee.java

public class Employee implements Serializable {

private static final long serialVersionUID = -3465813074586302847L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int empId;

@Column
private String name;

@Column
private String email;

@Column
private String address;

@Column
private String telephone;

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name="empUserId")
private EmployeeUserAccount employeeUserAccount;

//getters and setters

EmployeeUserAccount.java

public class EmployeeUserAccount implements Serializable {

private static final long serialVersionUID = -3465813074586302847L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int empUserId;

@Column
private String userName;

@Column
private String password;

@Column
private String userLevel;

@OneToOne(mappedBy="employeeUserAccount")
private Employee employee;

//getters and setters

EmployeeDAOImpl.java

public class EmployeeDAOImpl implements EmployeeDAO {

@Override
public Employee updateEmployee(Employee employee) {
    sessionFactory.getCurrentSession().update(employee);
    return employee;
}

EmployeeController.java

public class EmployeeController {

@RequestMapping(value = "/saveEmployee", method = RequestMethod.POST)
public ModelAndView saveEmployee(@ModelAttribute("command") Employee employee) {
    if (employee.getEmpId() == 0) {
        employeeService.addEmployee(employee);
    } else {
        employeeService.updateEmployee(employee);
    }
    return new ModelAndView("redirect:/");
}

EmployeeForm.jsp

<body>
<div align="center">
    <h1>New/Edit Employee</h1>
    <form:form action="saveEmployee" method="post" >
    <table>
        <form:hidden path="empId"/>
        <tr>
            <td>Name:</td>
            <td><form:input path="name" value="${employee.name}"/></td>
        </tr>
        <tr>
            <td>Email:</td>
            <td><form:input path="email" value="${employee.email}"/></td>
        </tr>
        <tr>
            <td>Address:</td>
            <td><form:input path="address" value="${employee.address}"/></td>
        </tr>
        <tr>
            <td>Telephone:</td>
            <td><form:input path="telephone" value="${employee.telephone}"/></td>
        </tr>
        <tr>
            <td>Username:</td>
            <td><form:input path="employeeUserAccount.userName" value="${employee.employeeUserAccount.userName}"/></td>
        </tr>
        <tr>
            <td>Password:</td>
            <td><form:input path="employeeUserAccount.password"  value="${employee.employeeUserAccount.password}"/></td>
        </tr>
        <tr>
            <td>Role:</td>
            <td>
                <form:select path="employeeUserAccount.userLevel">
                <c:forEach items="${role}" var="r">
                    <c:choose>
                        <c:when test="${r==employee.employeeUserAccount.userLevel}">
                            <option value="${r}" selected="true">${r}</option>
                        </c:when>
                        <c:otherwise>
                            <option value="${r}">${r}</option>
                        </c:otherwise>
                    </c:choose>
                </c:forEach>
                </form:select>
            </td>
        </tr>
        <tr>
            <td colspan="2" align="center"><input type="submit" value="Save"></td>
        </tr>
    </table>
    </form:form>
</div>

场景:

原来,tbl_employee 中的 empUserId 列是 1,它链接到 tbl_employee_user_account 的第一条记录。在我更新名称(从 name1 到 new-name1)后,tbl_employee_user_account 会创建 id 为 2 的新记录,并且 tbl_employee 中的 empUserId 更改为 2。

mysql> select * from tbl_employee;
 +-------+----------+--------+-----------+-----------+----------+
| empId | address  | email  | name      | telephone | empUserId |
+-------+----------+--------+-----------+-----------+-----------+
|     1 | address1 | email1 | new-name1 | tele1     |         2 |
+-------+----------+--------+-----------+-----------+-----------+

mysql> select * from tbl_employee_user_account;
+-----------+----------+-----------+-----------+----------+
| empUserId | employee | password  | userLevel | userName |
+-----------+----------+-----------+-----------+----------+
|         1 | NULL     | password1 | Admin     | user1    |
|         2 | NULL     | password1 | Admin     | user1    |
+-----------+----------+-----------+-----------+----------+

【问题讨论】:

  • @JoinColumn(name="empUserId") 更改为@JoinColumn(name="employeeUserAccount_empUserId")
  • 我更新了我的问题,我错误地复制了错误的列。
  • 删除 CascadeType.ALL 并重试
  • hibernate.ddl2auto的值是否更新?

标签: java mysql spring hibernate spring-mvc


【解决方案1】:

设身处地为 Hibernate 着想。您被要求更新员工。该员工由 ID 标识,具有新名称、新地址等,还有一个新用户帐户,而不是旧用户帐户,该帐户已经存在并由 ID 标识。新的没有任何ID。所以不可能和旧账户是同一个账户。所以 Hibernate 只是按照它被告知的去做:用一个新的帐户替换员工的帐户。

【讨论】:

  • 我想我明白你的意思了。如果您能建议该怎么做,我将不胜感激。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
相关资源
最近更新 更多