【问题标题】:How to create a table in DB from a JSON array to make a REST API in Spring Boot如何从 JSON 数组在 DB 中创建表以在 Spring Boot 中创建 REST API
【发布时间】:2021-05-17 04:17:14
【问题描述】:

大家下午好。

我从 Spring JSON 和 API Rest 开始,我正在做我的第一次练习,它包含一个带播放列表的 REST API,如下所示:

{

      "name":"Lista 1",

    "description": "Lista de canciones de Spotify",

     “songs”:

      [

              {

                   "title": "",

                   "artist": "",

                    "album": "",

                    "year": ""

                },

               {

                    "title": "",

                     "artist": "" ,

                      "album": "",

                      "year": ""

                },         

     … ]

}

为了练习,我想在 BD 中为这个 JSON 创建一个表,所以我创建了我的实体(我不知道我使用 POJO 是否正确):

package com.example.api.songs.entity;

import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity(name = "songs_list")
public class SongsList {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Integer id;

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

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

    @Column(name = "songs")
    private List<Songs> songs;

    public class Songs {

        public String title;
        public String artist;
        public String album;
        public int year;

    }

}

现在我想使用 JPA 和 spring.jpa.hibernate.ddl-auto = create 开始我的表,但我对歌曲字段有疑问,因为它是一个多维数组。起初我会想到这样的事情,但我不知道这样做是否正确:

CREATE TABLE LIST_SONGS (

ID INT PRIMARY KEY NOT NULL,

NAME TEXT NOT NULL,

DESCRIPTION VARCHAR(50) NOT NULL,

SONGS VARCHAR[][][]

);

或者您是否建议创建 2 个单独的实体?

【问题讨论】:

    标签: json postgresql spring-boot hibernate jpa


    【解决方案1】:
    1. @Entity 中的名称属性不适用于表名
    2. 表名始终使用大写
    3. 使用Long 作为id
    4. 表名应该类似于SONGS_LISTS,因为每条记录都是一个“歌曲列表”。当然最好找一个更好的名字。
    5. 始终为外键约束指定名称
    @Entity
    @Table(name = "SONGS_LISTS")
    public class SongsListEntity {
    
        @Id
        @GeneratedValue(strategy = GenerationType.SEQUENCE)
        @Column(name = "ID")
        private Long id;
    
        @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true, mappedBy = "songsList")
        private List<SongEntity> songs = new ArrayList<>();
    
    }
    
    @Entity
    @Table(name = "SONGS")
    public class SongEntity {
    
        @Id
        @GeneratedValue(strategy = GenerationType.SEQUENCE)
        @Column(name = "ID")
        private Long id;
    
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "SONGS_LIST_ID")
        private SongsListEntity songsList;
    
    }
    

    what is @JoinColumn and how it is used in Hibernate

    【讨论】:

    • 非常感谢您的更正,现在在数据库级别,据我所知,我必须创建 2 个表,其中 SONGS_LISTS 表中的每个 SONGS 都有一个外部表,对吗?
    • SONGS 中的@CesarJusto,让 Hibernate 创建表,您将看到正确的 DDL。最好也为外键约束指定一个名称。
    • 所以我不需要创建任何 ddl,只需启动它并配置 spring.jpa.hibernate.ddl-auto = create 应该会创建我的表,对吧?
    • @CesarJusto 是的。之后,如果您愿意,您可以使用已创建的 DDL 作为示例来创建 DDL。
    • 感谢您的帮助,我正在测试,但是我有一些问题,我在一个新问题stackoverflow.com/questions/66227521/… 中发布了
    猜你喜欢
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 2016-06-03
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多