OneToMany关系错误:字段' XX'没有默认值

时间:2017-10-15 18:49:04

标签: java mysql hibernate orm one-to-many

我试图在两个对象之间创建一对多关系,但是我遇到了这个错误。我不知道如何将对象MyUserAccount中的属性ID映射到对象Book。 ID是从Google收到的字符串数据(我在我的项目中进行社交登录)。

错误

PreparedStatementCallback; SQL [INSERT INTO Books(TENSACH, TACGIA, NHANXET, TINHTRANG, THELOAI, IMAGE, IMAGE_NAME) VALUES ( ?, ?, ?, ?, ?, ?, ?)]; Field 'ID' doesn't have a default value; nested exception is java.sql.SQLException: Field 'ID' doesn't have a default value

BookDao(如何将对象簿保存到数据库中)

public void save(Book book) {
    // TODO Auto-generated method stub
    KeyHolder keyHolder = new GeneratedKeyHolder();
    String sql = "INSERT INTO Books(TENSACH, TACGIA, NHANXET, TINHTRANG, THELOAI, IMAGE, IMAGE_NAME) "
            + "VALUES ( :tensach, :tacgia, :nhanxet, :tinhtrang, :theloai, :image, :image_name)";

    namedParameterJdbcTemplate.update(sql, getSqlParameterByModel(book), keyHolder);
    book.setBook_ID(keyHolder.getKey().intValue());
}

private SqlParameterSource getSqlParameterByModel(Book book) {
        MapSqlParameterSource paramSource = new MapSqlParameterSource();
        paramSource.addValue("book_id", book.getBook_ID());
        paramSource.addValue("tensach", book.getTensach());
        paramSource.addValue("tacgia", book.getTacgia());
        paramSource.addValue("nhanxet", book.getNhanxet());
        paramSource.addValue("tinhtrang", book.getTinhtrang());
        paramSource.addValue("image", book.getImage());
        paramSource.addValue("image_name", book.getImage_name());
        paramSource.addValue("theloai", book.getTheloai());
        return paramSource;
    }

模特书

public class Book implements Serializable {

private static final long serialVersionUID = 1L;
private Integer book_ID;
private String tensach;
private String tacgia;
private String nhanxet;
private String tinhtrang;
private String theloai;
private byte[] image;
private String image_name;
private String data;
private MyUserAccount myUserAccount;

public Book() {

}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ID", nullable = false)
public MyUserAccount getMyUserAccount() {
    return this.myUserAccount;
}

public void setMyUserAccount(MyUserAccount myUserAccount) {
    this.myUserAccount = myUserAccount;
}

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "book_id", unique = true, nullable = false)
public Integer getBook_ID() {
    return book_ID;
}

@Column(name = "image_name")
public String getImage_name() {
    return image_name;
}

@Column(name = "tensach", length = 50, nullable = true)
public String getTensach() {
    return tensach;
}

@Lob
@Type(type = "org.hibernate.type.BinaryType")
@Column(name = "image", columnDefinition = "LONGBLOB", nullable = true)
public byte[] getImage() {
    return image;
}

@Column(name = "tacgia", length = 50, nullable = true)
public String getTacgia() {
    return tacgia;
}

@Column(name = "nhanxet", length = 100, nullable = true)
public String getNhanxet() {
    return nhanxet;
}

@Column(name = "tinhtrang", length = 50, nullable = true)
public String getTinhtrang() {
    return tinhtrang;
}

@Column(name = "theloai", length = 50, nullable = true)
public String getTheloai() {
    return theloai;
}

@Column(name = "data", length = 16777215)
public String getData() {
    return data;
}

public void setBook_ID(Integer book_ID) {
    this.book_ID = book_ID;
}

public void setImage_name(String image_name) {
    this.image_name = image_name;
}

public void setImage(byte[] image) {
    this.image = image;
}

public void setTensach(String tensach) {
    this.tensach = tensach;
}

public void setTacgia(String tacgia) {
    this.tacgia = tacgia;
}

public void setNhanxet(String nhanxet) {
    this.nhanxet = nhanxet;
}

public void setTinhtrang(String tinhtrang) {
    this.tinhtrang = tinhtrang;
}

public void setTheloai(String theloai) {
    this.theloai = theloai;
}

public void setData(String data) {
    this.data = data;
}

@Override
public String toString() {
    return "Book [book_ID=" + book_ID + ", tensach=" + tensach + ", tacgia=" + tacgia + ", nhanxet=" + nhanxet
            + ", tinhtrang=" + tinhtrang + ", theloai=" + theloai + ", image=" + Arrays.toString(image) + "]";
}
}

模型MyUserAccount。

public class MyUserAccount implements Serializable {

private static final long serialVersionUID = 1L;
public static final String ROLE_USER = "ROLE_USER";
private String id;
private String email;
private String userName;
private String firstName;
private String lastName;
private String password;
private String role;
private String enabled;
private List<Book> book = new ArrayList<Book>(0);

public MyUserAccount() {

}

@OneToMany(fetch = FetchType.LAZY, mappedBy = "myUserAccount")
public List<Book> getBook() {
    return book;
}

public void setBook(List<Book> book) {
    this.book = book;
}

public MyUserAccount(String id, String email, String userName, String firstName, //
        String lastName, String password, String role, String enabled) {
    this.id = id;
    this.email = email;
    this.userName = userName;
    this.firstName = firstName;
    this.lastName = lastName;
    this.password = password;
    this.role = role;
    this.enabled = enabled;
}

@Id
@Column(name = "ID", unique = true, nullable = false)
public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

@Column(name = "EMAIL", unique = true, nullable = false)
public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

@Column(name = "USER_NAME", unique = true, nullable = false)
public String getUserName() {
    return userName;
}

public void setUserName(String userName) {
    this.userName = userName;
}

@Column(name = "FIRST_NAME", nullable = false)
public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

@Column(name = "LAST_NAME", nullable = false)
public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

@Column(name = "PASSWORD", nullable = false)
public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

@Column(name = "ROLE", nullable = false)
public String getRole() {
    return role;
}

public void setRole(String role) {
    this.role = role;
}

@Column(name = "ENABLED", columnDefinition = "VARCHAR(1) default 'Y'", nullable = false)
public String getEnabled() {
    return enabled;
}

public void setEnabled(String enabled) {
    this.enabled = enabled;
}
}

控制器

@RequestMapping(value = "/motsach/add/", method = RequestMethod.POST)
    public String saveBook(@ModelAttribute("bookForm") @Validated Book book, BindingResult result, Model model,
            @RequestParam CommonsMultipartFile[] image, String userName, final RedirectAttributes redirectAttributes)
            throws IOException, UnsupportedEncodingException {

    MyUserAccount myUserAccount = myUserAccountDAO.findByUserName(userName);
    System.out.println(userName + "sssssssssssss");
    book.setMyUserAccount(myUserAccount);
    redirectAttributes.addFlashAttribute("css", "success");
    if (book.getBook_ID() == null) {
        System.out.println(book.getBook_ID());
        redirectAttributes.addFlashAttribute("msg", "book added successfully!");
    } else {
        redirectAttributes.addFlashAttribute("msg", "book updated successfully!");
    }
    for (CommonsMultipartFile aFile : image) {
        System.out.println("Saving file: " + aFile.getOriginalFilename());
        book.setImage_name(aFile.getOriginalFilename());
        book.setImage(aFile.getBytes());
        System.out.println("Damn that Shit!");
    }
    bookService.saveOrUpdate(book);
    // POST/REDIRECT/GET
    return "redirect:/motsach/" + book.getBook_ID();
}

1 个答案:

答案 0 :(得分:1)

您有@manyToOne(ID为名称)关系,不能为空。因此,为了添加图书,您必须在保存之前将MyUserAccount设置为图书,否则您可以转为:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ID", nullable = true)
public MyUserAccount getMyUserAccount() {
    return this.myUserAccount;
}

并修改数据库中的列以设置空值的可能性。