【问题标题】:Spring JPA Can Modify Entity But Can't CreateSpring JPA 可以修改实体但不能创建
【发布时间】:2016-02-03 13:26:53
【问题描述】:

我的 Spring JPA 项目中有一个奇怪的问题,它阻止我创建新用户,但我可以修改现有用户。我正在为我的方法实现 Spring JPA 的 CrudRepository

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

如果通过表单创建的用户没有 ID,我会手动为他们分配一个 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(){}

形式(百里香叶)

<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 - 这里有什么我可以忽略的吗?

【问题讨论】:

  • 您在哪里/如何在用户中设置id 值?
  • 如果我正在修改现有用户记录,Thymeleaf 会将 ID 值与其 th:field 属性绑定
  • Yes..Edit 将起作用,因为数据库中的Id 将映射到隐藏字段&lt;p&gt;ID: &lt;input type="hidden" th:field="*{id}" /&gt;&lt;/p&gt;,并且此id 将用于保存用户对象。但是为了插入一个新的User,你应该指定Id的值,通过将隐藏字段设置为文本字段并提供Id作为输入或使用@Id @GeneratedValue注释`private Long id;`以便主键值将自动生成并成功保存对象。
  • 我现在确实设置了@Id 和@GeneratedValue,并且我需要隐藏ID 输入,这样用户就不会手动设置它,该值仍会以表单形式发送。我的问题是我在保存方法之前手动设置了 ID,并且在持久化时它仍然被视为 null。这有意义吗?
  • 哎呀抱歉我错过了那部分:),您是否通过向控制台打印某些内容来检查if 条件是否实际执行?

标签: java spring spring-mvc jpa


【解决方案1】:

您的代码中有两件事可疑:

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

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

祝克莱好运!!!

【讨论】:

  • 感谢高级版,@GeneratedValue 是这里出现问题的原因,因为我没有在 User 表中的 ID 列上设置身份
【解决方案2】:

我的建议是创建一个序列,该序列将用作自动生成 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 **/
}

【讨论】:

    猜你喜欢
    • 2012-12-06
    • 2011-09-20
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多