JPA序列化/反序列化嵌套自动生成的字段

时间:2019-12-15 13:36:27

标签: java spring-boot jpa repository

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?

2 个答案:

答案 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;