ความสัมพันธ์แบบหนึ่งต่อกลุ่มทิศทางเดียวโดยไม่ต้องรวมตาราง

@Entity
@Table
public class Book {

    @Id @GeneratedValue @Column private Long bookId;

    @Column private String name;

    @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
    @JoinColumn(name="bookId")
    private List<Chapter> chapters=new ArrayList<Chapter>();
.....

@Entity
@Table
public class Chapter {

    @Id @Column @GeneratedValue
    private Long cid;

    @Column private String name;

    @Column private Long bookId;
....

ฉันควรใช้คำอธิบายประกอบแบบใดใน Chapter.bookId เพื่ออ้างอิงถึง Book.bookId ดังนั้น Chapter.bookid จะใช้ค่าที่สร้างขึ้นของ Book.bookId ในขณะที่แทรก Book ใหม่

    Book bk=new Book();
    bk.setName("b1");

    Chapter ch=new Chapter();
    ch.setName("b1c1");
    bk.getChapters().add(ch);

ฉันได้รับข้อผิดพลาดนี้ ไฮเบอร์เนต: แทรกลงในค่าหนังสือ (ชื่อ) (?) ไฮเบอร์เนต: แทรกลงในค่าบท (bookId, ชื่อ) (?, ?) 19:56:59,094 ข้อผิดพลาด JDBCExceptionReporter:234 - คอลัมน์ 'bookId' ไม่สามารถเป็นค่าว่างได้


person yodhevauhe    schedule 06.04.2011    source แหล่งที่มา


คำตอบ (2)


คุณจะต้องตั้งค่า Chapter.bookId ด้วยตัวเองหรือเปลี่ยนการอ้างอิงใน Chapgter จาก Long เป็น Book เพิ่มคำอธิบายประกอบ @ManyToOne และตั้งค่าการอ้างอิงไปยังหนังสือด้วยตนเอง

ในกรณีนี้ ฝั่งเจ้าของของความสัมพันธ์จริงๆ แล้วคือ Chapter กล่าวคือ บทหนึ่งจะกำหนดว่าความสัมพันธ์นั้นอยู่ในหนังสือเล่มใด

person Thomas    schedule 06.04.2011
comment
ใช่. ในกรณีนี้ ผู้คนส่วนใหญ่จะเพิ่มวิธีการอำนวยความสะดวกใน Book (เรียกว่า addChapter หรือบางอย่าง) ซึ่งรวมการเพิ่มบทลงในคอลเลกชันและการตั้งค่าการอ้างอิงหนังสือของบท - person codelark; 06.04.2011

ใช้ @Column(nullable=true) หากคุณต้องการค่า Null จริงๆ มิฉะนั้นตามที่กล่าวไว้ในคำตอบก่อนหน้า - คุณต้องตั้งค่าด้วยตนเอง การเพิ่มบทในรายการไม่ได้ตั้งค่า bookId

person Paul Lysak    schedule 06.04.2011