使用Spring MVC + Hibernate,我想对Employee实体执行CRUD操作。
employee实体与user实体具有一对一的关系,如下图所示:

我在更新员工信息时遇到问题。CREATE、READ和DELETE操作运行良好。
但是当我更新员工信息时,它从employee_user表中删除了记录,打破了员工和相应用户之间的关系。
我只有一个JSP页面来保存员工和用户信息。
JSP:
<form:form action="save" method="post" commandName="employee"">
<div>
<div>
<label for="firstName">Name: </label>
<form:input id="firstName" path="firstName" type="text" />
</div>
<div>
<label for="email">Email: </label>
<form:input id="email" path="email" type="text" />
</div>
<div>
<label for="phone">Phone: </label>
<form:input id="phone" path="phone" type="text" />
</div>
<div>
<label for="usernmae">Username: </label>
<form:input id="username" path="user.username" type="text" />
</div>
<div>
<label for="password">Password: </label>
<form:input id="password" path="user.password" type="text" />
</div>
</div>
<form:input path="id" type="hidden" />
<form:input path="user.id" type="hidden" />
<input type="submit" name="save" value="Save" class="btn btn-primary" />
</form:form>员工模型如下:
@Entity
@Table(name = "employee")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column
private String firstName;
@Column
private String email;
@Column
private String phone;
@OneToOne
@JoinTable(name = "employee_user", joinColumns = { @JoinColumn(name = "employee_id", referencedColumnName = "id") },
inverseJoinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") })
@Cascade({ org.hibernate.annotations.CascadeType.ALL })
private User user;
// getters and setters
}USER模型是:
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column
private String username;
@Column
private String password;
@OneToOne
@JoinTable(name = "employee_user", joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") },
inverseJoinColumns = { @JoinColumn(name = "employee_id", referencedColumnName = "id") })
@Cascade({ org.hibernate.annotations.CascadeType.ALL })
private Employee employee;
// getters and setters
}控制器部分如下所示。相同的方法同时处理创建和更新请求。
@RequestMapping(value = "/save", method = RequestMethod.POST)
public String saveEmployee(@ModelAttribute("employee") Employee employee,
BindingResult result) {
employeeService.save(employee);
return "";
}在这里,保存方法调用Hibernate的Session.merge(employee);方法。
谁能让我知道幕后的问题是什么?
谢谢!
发布于 2015-05-20 10:21:21
这个问题的原因是,您的ModelAttribute employee对象将被表单.So中的新值覆盖,对待用户对象为空.you可以通过id从数据库中搜索员工,然后从搜索到的员工.finally中设置用户,合并employee对象。
https://stackoverflow.com/questions/30336345
复制相似问题