我有两张这样的桌子
首先,为了数据完整性,我尝试将表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)
| 归档时间: |
|
| 查看次数: |
3267 次 |
| 最近记录: |