У меня похожая проблема, как описано в Spring Framework - Новый объект создается в БД вместо обновления , но у меня есть две сущности: Author
и Department
в отношении @ManyToOne
. Один отдел имеет много авторов, и один автор принадлежит одному отделу. Когда я обновляю автора, сведения об авторе обновляются, но вставляется отдел, что приводит к дублированию записей. Из вышеупомянутой ссылки я знаю, что, возможно, мне не хватает идентификатора отдела, но я не знаю, как связать отдел с его идентификатором.
Авторская сущность (без геттеров и сеттеров)
@Entity
@Table(name = "author")
public class Author implements Serializable {
@Id
@Column(name = "idauthor")
@GeneratedValue
private Integer idAuthor;
@Column(name = "name")
private String name;
@ManyToOne(cascade = CascadeType.ALL)
private Department department;
}
Подразделение (без геттеров и сеттеров)
@Entity
@Table(name="department")
public class Department implements Serializable {
@Id
@Column(name="iddepartment")
@GeneratedValue
private Integer iddepartment;
@Column(name="name", unique=true)
private String name;
}
Методы обновления операций Автора в AuthorController
@Controller
@RequestMapping("/author")
public class AuthorController {
@Autowired
private AuthorService authorService;
@Autowired
private DepartmentService departmentService;
@RequestMapping(value="/save/{authorId}", method = RequestMethod.GET)
public String renderUpdateForm(@PathVariable("authorId") Integer authorId, ModelMap model) {
model.addAttribute("author", authorService.getAuthorByID(authorId));
model.addAttribute("departmentList", departmentService.listDepartment());
return "author.save";
}
@RequestMapping(value="/save/{authorId}", method = RequestMethod.POST)
public String updateAuthor(@ModelAttribute("idAuthor") Author author, BindingResult result, SessionStatus status) {
authorService.updateAuthor(author);
status.setComplete();
return "redirect:/author";
}
}
authorService.updateAuthor(author);
вызывает службу, которая вызывает класс DAO с методом:
@Repository
@Transactional
public class AuthorDAOImpl implements AuthorDAO {
@Autowired
private SessionFactory sessionFactory;
@Override
public void updateAuthor(Author author) {
sessionFactory.getCurrentSession().update(author);
}
}
и, наконец, JSP с формой
<form:form method="post" action="${pageContext.request.contextPath}/author/save" modelAttribute="author">
<form:hidden path="idAuthor" />
<table>
<tr>
<td>
<form:label path="name">
<spring:message code="label.author.name"/>
</form:label>
</td>
<td><form:input path="name" /></td>
</tr>
<tr>
<td>
<form:label path="department.name">
<spring:message code="label.author.department"/>
</form:label>
</td>
<td>
<form:select path="department.name">
<form:options items="${departmentList}" itemValue="name" itemLabel="name" />
</form:select>
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="<spring:message code="label.update" />
</td>
</tr>
</table>
</form:form>
И ошибка, которую я получаю,
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:
Дубликат записи 'Таможенный отдел
имя "для ключа" имя "
Как мне передать ID в отдел или исправить мою проблему? Спасибо за ваши советы.