簡體   English   中英

Spring JPA可以修改實體但不能創建

[英]Spring JPA Can Modify Entity But Can't Create

我的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

我可以看到當推送到save方法時確實設置了用戶ID-在這里我可以忽略什么嗎?

您的代碼中有兩點可疑:

  1. 取出在實體類中定義的公共構造函數。 (如果我是對的,則不建議使用JPA規范)

  2. 從實體類中刪除“ @GeneratedValue(strategy = GenerationType.IDENTITY)”行(如果實際上未按表中的定義定義)。

祝你好運粘土!

我的建議是創建一個序列,該序列將像自動生成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 **/
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM