Spring-boot中有一个这样的项目:
模型页:
@Entity
@Table(name = "pages")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Page implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "color")
private String color;
@OneToMany(mappedBy = "page", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<Note> note;
// constructor, getters and setters
模型注释(一页可以包含许多注释,notes.page_id是pages.id的外键):
@Entity
@Table(name = "notes")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Note implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "content")
private String content;
@Column(name = "title")
private String title;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "page_id")
private Page page;
// constructor, getters and setters
控制器:
public ResponseEntity<Object> createPage(@RequestBody Page page) {
pageRepository.saveAndFlush(page);
return new ResponseEntity("OK", HttpStatus.OK);
}
当我使用以下Json请求正文向端点发出Post请求时
{
"id": null,
"color": "yellow",
"note": [
{
"id": null,
"title": "Java",
"content": "Java is awesome",
"page": null
},
{
"id": null,
"title": "Python",
"content": "Python is good",
"page": null
}
]
}
新记录已创建到数据库,页面ID和注释ID正确生成,但notes.page_id字段为空。
表pages
:
id|color |
1 |yellow |
表notes
:
id| content |title |page_id|
1 | Java is awesome|Java | null |
2 | Python is good |Python| null |
问题是:如何为notes.page_id提供自动生成的pages
表ID?
答案 0 :(得分:1)
JPA实体的原理实际上很简单。
您的JPA实体中有一个字段,该字段映射到数据库表中的列。
此字段包含的内容将写入表中的相应数据库列。
您的Node.page
字段是映射到note.page_id
列的字段。
并且该字段的值为null
。因此,写入数据库列的是null
。
如果您想在该列中具有页面ID,则需要在此字段中使用非空page
。因此,您的代码需要完成
page.getNotes().forEach(note -> note.setPage(page))
那样简单而合乎逻辑。
答案 1 :(得分:0)
如下修改您的笔记类代码
@ManyToOne
@JoinColumn(name="page_id", nullable=false)
private Page page;