У меня есть эта странная проблема в моем проекте Spring JPA, который мешает мне создавать новых пользователей, но я могу изменить существующие. Я применяю Spring JPA CrudRepository
для моих методов.Spring JPA может изменить объект, но не может создать
- Есть 200 существующих пользователей в моей таблице
- можно вручную создать с помощью сценариев SQL
Если созданный пользователем через форму не имеет идентификатора, я вручную назначить один к они - только ради тестирования в
Класс
@Entity(name="User")
public class User {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="Id", nullable = false)
private Long id;
@Column(name="name")
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User(){}
Форма (Thymeleaf)
<form th:action="@{/saveUser}" th:object="${user}" method="post">
<p>Name: <input type="text" th:field="*{name}" /></p>
<p>ID: <input type="hidden" th:field="*{id}" /></p>
</form>
Контроллер
@RequestMapping(value = "/saveUser", produces = "text/html", method = RequestMethod.POST)
public ModelAndView saveUser(
@ModelAttribute("user") User user,
@RequestParam("id", required = false) Long Id,
Model model) {
try {
if(user.getId() == null || user.getId() == 0){
user.setId(40000) //arbitrary ID
}
userRepo.save(user);
} catch(Exception e){
logger.error("Error saving user" + e.getMessage());
}
return getUserForm(user.getId());
}
Однако я получаю ошибку при сохранении
Cannot insert the value NULL into column 'Id', table 'dbo.User'; column does not allow nulls. INSERT fails
Я могу видеть идентификатор пользователя действительно устанавливается при получении толкнул метода сохранения - есть все, что я может быть здесь?
где/как вы устанавливаете значение id в User? –
Thymeleaf свяжет значение ID с его атрибутом th: field, если я изменяю существующую запись пользователя –
Да ..Этот будет работать, потому что 'Id' в базе данных будет отображаться в скрытое поле'
ID: <тип ввода = "hidden" th: field = "* {id}" />
'и этот' id' будет использоваться для сохранения пользовательского объекта. Но для того, чтобы вставить новый «Пользователь», вы должны указать значение «Id», сделав скрытое содержимое в текстовое поле и передав Id в качестве ввода или аннотируя «private Long id;» с помощью '@Id @ GeneratedValue', чтобы значение первичного ключа будет генерироваться автоматически и объект будет успешно сохранен. –