Spring Data JPA--@ManyToOne和@OneToMany - Go语言中文社区

Spring Data JPA--@ManyToOne和@OneToMany


外键是设计数据库时经常用到的概念,那么Spring Data JPA设计外键怎么设计?

Entity

设计E-R图,这里我是在写一个相册和图片之间的关系。

相册:

@Entity
public class Album {
    @Id //标识主键
    @GeneratedValue(strategy = GenerationType.AUTO) //自增字段
    private long albumId;

    private long userId;
    private String name;
    //相册之于图片,一对多,级联设置为相册删除图片删除,被Picture实体albumid映射
    @OneToMany(cascade = CascadeType.ALL,mappedBy = "albumId")
    @JsonManagedReference  //少的一方管理映射,将在测试结果中看出
    private List<Picture> pictures;

    //定义枚举写到数据库实际类型为int值
    @Enumerated(EnumType.ORDINAL)
    private Category category;

    @Enumerated(EnumType.ORDINAL)
    private ACLType acl;
}

图片:

@Entity
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
 /**
 *防止懒惰加载异常应加一句上面的注解,防止用时加载还未完成
 类似:
  No serializer found for class org.hibernate.proxy.pojo?
**/
public class Picture {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long pictureId;

    private long userId;

    @ManyToOne  //图片之于相册,多对一
    @JoinColumn  //抑制ORM建造多余表
    @JsonBackReference  //设置少的一方管理集合,属性名于mappedBy相对应
    private Album albumId;

    private String name;

    private String url;

    private boolean approved;
}

repository

自定义实现超出讨论范围,所以repository都相当简单:

@Repository
public interface AlbumRepository extends JpaRepository<Album,Long> {

}

@Repository
public interface PictureRepository extends JpaRepository<Picture,Long> {

}

controller

写几个端点,来验证一下:

@RestController
public class AlbumController {

    Logger logger= LoggerFactory.getLogger(AlbumController.class);

    @Autowired
    AlbumRepository albumRepository;
   
    //创建相册
    @PostMapping("/createAlbum")
    public void createAlbum(@RequestBody ModelAlbum album){
        logger.info(album.toString());
        Album albumtemp=album.adapter();
        albumRepository.save(albumtemp);
    }
   //获取相册列表
    @GetMapping("/getAlbums")
    public List<Album> getAlbums(){
        return albumRepository.findAll();
    }

}
@RestController
public class PictureController {

    Logger logger= LoggerFactory.getLogger(PictureController.class);

    @Autowired
    PictureRepository pictureRepository;

    @Autowired
    AlbumRepository albumRepository;

     //这里的代码有点糟糕,不过看一下
    @PostMapping("/createPictureInfo")
    public long createPictureInfo(@RequestBody Picture picture){
         logger.info(modelPicture.toString());
         Picture picture1=pictureRepository.save(picture);
          return picture1.getPictureId();
    }

    @GetMapping("/getPicture")
    public Picture getPicture(@RequestParam("picId")long id){
        return pictureRepository.getOne(id);
    }

   @GetMapping("/albumContent")
    public List<Picture> findAlbumPicture(@RequestParam("albumid")long albumid){
        return albumRepository.getOne(albumid).getPictures();
    }

}

Test

像这样传入数据

默认Spring boot RestController使用JSON作为默认格式

在这里插入图片描述

注意到picture中没有相册信息,因为它是多的一方,我们上面将关系委托给少的一方。
在这里插入图片描述
在少的一方album会看到图片集合的信息。
在这里插入图片描述

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_33745102/article/details/86554785
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢