Hibernate 单向 OneToMany 关系与外键非空约束

fah*_*dul 9 java hibernate

我有两张这样的桌子

表模式

首先,为了数据完整性,我尝试将表course_id中的外键设置review不为空约束。

所以我为这两个表创建带注释的类,如下所示:

@Data
@Entity
@Table(name = "course")
public class Course {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "course_id")
    private int id;

    @Column(name = "name")
    private String name;

    @OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
    @JoinColumn(name = "course_id")
    private List<Review> reviews;

    public Course(){}

    public Course(String name){
        this.name = name;
    }

    public void addReview(Review review){
        if(this.reviews == null){
            this.reviews = new ArrayList<>();
        }
        this.reviews.add(review);
    }
}

@Data
@Entity
@Table(name = "review")
public class Review {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "review_id")
    private int reviewId;

    @Column(name = "rating")
    private int rating;

    public Review(){}

    public Review(int rating){
        this.rating = rating;
    }
}
Run Code Online (Sandbox Code Playgroud)

我创建了简单的应用程序来添加对现有课程的评论,如下面的代码:

session.beginTransaction();

// get instructor from db
Course course = session.get(Course.class, 3);

// create review
Review review1 = new Review(4);

course.addReview(review1);

// save to db
session.save(course);

session.getTransaction().commit();
Run Code Online (Sandbox Code Playgroud)

但是这个程序会抛出一个错误,因为它违反了我之前在数据库中设置的非空约束

导致:org.postgresql.util.PSQLException:错误:列“course_id”中的空值违反了非空约束

但如果删除非空约束,该程序可以正常工作,因为 hibernate 将首先执行带有空值的插入,而不是更新值,如下所示:

Hibernate: insert into review (rating) values (?)
Hibernate: update review set course_id=? where review_id=?
Run Code Online (Sandbox Code Playgroud)

有没有办法让 hibernate 直接插入 course_id 值,以便我可以保留非空约束

谢谢!

Dav*_*lto 18

您需要在映射中指定该列不是nullable

@JoinColumn(name = "course_id", nullable = false)
Run Code Online (Sandbox Code Playgroud)