【发布时间】: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