2017-10-15 28 views
1

2つのオブジェクト間に1対多数の関係を作成しようとしていますが、このエラーが発生しました。オブジェクトMyUserAccountのプロパティIDをオブジェクトブックにマッピングする方法がわかりません。 IDはGoogleから受け取った文字列データです(私は自分のプロジェクトでソーシャル・ログインを行っています)。OneToMany関係のエラー:フィールド 'XX'にデフォルト値がありません

エラー

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

あなたはnullにすることはできません@manyToOne(名としてIDを持つ)関係を持っています。

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

とNULL値の可能性を設定するには、データベースにあなたの列を変更:あなたが保存する前にブックへMyUserAccountを設定するために持っているか、あなたに回すことができる本を追加するために、そう。

+0

ありがとうございますが、MyUserAccountを予約するにはどうすればよいですか?私は本当にそれを行う必要がある、私はちょうど私のコントローラを更新しました。私はどのようにプロパティuserNameを取得するのか分からない –

+0

あなたは今取得するエラーは何ですか?それは同じものですか? –

+0

いいえ、エラーはuserNameプロパティがnullです。あなたが言ったように、MyUserAccountをBookに設定しようとしていますが、最初はMyUserAccountデータを取得できません。常にnullを返します。 –

関連する問題