zoukankan      html  css  js  c++  java
  • spring-data-jpa多对多映射

    仅做笔记用

    第一次写多对多:

    需求:相册(Album)分类(Fenlei)  一个相册有多个分类,一个分类有多个相册

    主要代码:

    @Entity
    @Table(name = "album")
    public class Album {/*相册类*/
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        @ManyToMany
        @JoinTable(name = "album_fenlei",
                joinColumns = @JoinColumn(name = "album_id"),
                inverseJoinColumns = @JoinColumn(name = "fenlei_id"))
        private List<Fenlei> fenleis;/*多对多 分类*/
    

      

    @Entity
    @Table(name = "fenlei")
    public class Fenlei {//分类类
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        @ManyToMany(mappedBy = "fenleis")
        private List<Album> albums;/*多对多  相册*/  

    编写测试类

    dao层为:public interface AlbumDao extends JpaRepository<Album,Long> 
         Fenlei fenlei = new Fenlei(1,"fenlei",null);
            Fenlei fenlei2 = new Fenlei(2,"fenlei2",null);
            List<Fenlei> fenleis = new ArrayList<>();
            fenleis.add(fenlei);
            fenleis.add(fenlei2);
            Album album = new Album(1,fenleis);
            albumDao.save(album);
    //如果只执行上面这些;数据库中的fenlei表数据为空,album表有一条数据,album_fenlei有两条数据
    //如果加上下面这些;数据库中的fenlei表 有两条数据 fenleiDao.save(fenlei); fenleiDao.save(fenlei2);

      

    插入数据后 一个相册id为2,两个分类    只看中间表id为1和2

    但是

            Fenlei fenlei=new Fenlei(1,null);
            List<Album> albums = new ArrayList<>();
            Album album = new Album(1,null);
            Album album1 = new Album(2,null);
            albums.add(album);
            albums.add(album1);
            fenlei.setAlbums(albums);
            fenleiDao.save(fenlei);  
    //执行之后三张表都为空

    下面给与解释,参照https://www.cnblogs.com/jpfss/p/10893800.html

    其中最主要的就是多对多关联映射上面的注解

    1、多对多关系中一般不设置级联保存、级联删除、级联更新等操作。(没有设置)

    2、可以随意指定一方为关系维护端,在这个例子中,我指定 Album为关系维护端,所以生成的关联表名称为: album_fenlei,关联表的字段为:album_id 和 fenlei_id。

    3、多对多关系的绑定由关系维护端来完成,即由 Album.setFenleis(fenleis) 来绑定多对多的关系(生成中间表)。关系被维护端不能绑定关系(也就是不能生成中间表),即fenlei不能绑定关系。

    4、多对多关系的解除由关系维护端来完成,即由Album.getFenleis().remove(fenlei)来解除多对多的关系。关系被维护端不能解除关系(删除fenlei,不能删除中间表信息),即Fellei不能解除关系。

    5、如果 Album 和 Fenlei 已经绑定了多对多的关系,那么不能(我测试了可以直接删除,但中间表不变)直接删除 Fenlei,需要由 Album 解除关系后,才能删除 Fenlei。但是可以直接删除 Album,因为 Album 是关系维护端,删除 Album 时,会先解除(删除中间表) Album 和 Fenlei 的关系,再删除 Fenlei。

  • 相关阅读:
    移动端适配原理浅析
    springMVC框架下——通用接口之图片上传接口
    Nginx服务器
    sql sever和mysql 卸载及oracle安装
    高清图片爬取
    中国部分大学排名爬虫
    selenium和PhantomJS的安装
    NYOJ2—括号配对问题
    爬虫之小说爬取
    数据库系统概论书本基础知识
  • 原文地址:https://www.cnblogs.com/5aixin/p/11838862.html
Copyright © 2011-2022 走看看