Обновление данных БД через форму в Spring вставляет дубликаты - PullRequest
1 голос
/ 27 июня 2011

У меня похожая проблема, как описано в 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 в отдел или исправить мою проблему? Спасибо за ваши советы.

1 Ответ

0 голосов
/ 28 июля 2011

Мне пришлось добавить Форматировщики SPI (см. документация для получения дополнительной информации) для каждого POJO.Затем в спящем режиме обновляются объекты вместо сохранения дублирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...