2016-02-03 3 views
0

У меня есть эта странная проблема в моем проекте 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 

Я могу видеть идентификатор пользователя действительно устанавливается при получении толкнул метода сохранения - есть все, что я может быть здесь?

+1

где/как вы устанавливаете значение id в User? –

+0

Thymeleaf свяжет значение ID с его атрибутом th: field, если я изменяю существующую запись пользователя –

+0

Да ..Этот будет работать, потому что 'Id' в базе данных будет отображаться в скрытое поле'

ID: <тип ввода = "hidden" th: field = "* {id}" />

'и этот' id' будет использоваться для сохранения пользовательского объекта. Но для того, чтобы вставить новый «Пользователь», вы должны указать значение «Id», сделав скрытое содержимое в текстовое поле и передав Id в качестве ввода или аннотируя «private Long id;» с помощью '@Id @ GeneratedValue', чтобы значение первичного ключа будет генерироваться автоматически и объект будет успешно сохранен. –

ответ

1

Подозрительные две вещи в вашем коде:

  1. Достаньте открытый конструктор, определяющий в классе сущностей. (если я правильно, спецификация JPA не рекомендую)

  2. Вынимают «@GeneratedValue (стратегия = GenerationType.IDENTITY)» строки из класса сущностей, если это на самом деле не определен, как в таблице.

Удачи вам!

+0

Спасибо Premium, причина '@ GeneratedValue' была причиной этой проблемы, поскольку у меня нет идентификатора, установленного в столбце ID в таблице User –

0

Мое предложение состоит в том, чтобы создать последовательность, которая будет использоваться как стратегия автоматического генерации значений id. Это избавит вас от установки его вручную.

Ваша модель отредактирован с тем, что я имел в виду выше:

@Entity(name="User") 
// Define a sequence 
@SequenceGenerator(name="seq", initialValue=1, allocationSize=100) 
public class User { 
    @Id 
    // Attach the sequence 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq") 
    private Long id; 
    private String name; 
    /** Getters & Setters **/ 
} 
Смежные вопросы