Spring JPA可以修改实体但无法创建

时间:2016-02-03 13:26:54

标签: java spring spring-mvc jpa

我的Spring JPA项目中存在这个奇怪的问题,导致我无法创建新用户,但我可以修改现有用户。我正在为我的方法实现Spring JPA CrudRepository

  • 我的表格中有200个现有用户
  • 我可以使用SQL脚本手动创建

如果通过表单创建的用户没有ID,我会手动为他们分配一个 - 只是为了测试而

@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

我可以看到在推送到save方法时确实设置了用户ID - 有什么我可以忽略的吗?

2 个答案:

答案 0 :(得分:1)

代码中有两件事可疑:

  1. 取出实体类中定义的公共构造函数。  (如果我是正确的,不建议使用JPA规范)

  2. 如果实际上未在表中定义,则从实体类中取出“@GeneratedValue(strategy = GenerationType.IDENTITY)”行。

  3. 祝你好运粘土!!!

答案 1 :(得分: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 **/
}