多对多关系映射

个人总结

  1. 需要用到@manytomany注解,然后在需要维护关系的一方,加上@joinTable注解。

  2. 必须指定一个维护关系,否则会导致关系表id重复出现错误。

  3. @joinTable 有以下属性,joinColumns ,设定该实体类映射在关系表中的外键列名和参照列,inverseColumns ,设定和该实体类关联的实体,在关系表中的外键列名和参照列。name指定表名

  4. 在不维护关系的一端,还需要设置mappedBy

  5. 同样,由于关系表的存在,所以无论是维护关系的一方还是不维护关系的一方,都默认采用延迟加载策略。

双向多对多关联关系

在双向多对多关系中,我们必须指定一个关系维护端(owner side),可以通过 @ManyToMany 注释中指定 mappedBy 属性来标识其为关系维护端。

@ManyToMany
@JoinTable(name="中间表名称",
joinColumns=@joinColumn(name="本类的外键",
referencedColumnName="本类与外键对应的主键"),
inversejoinColumns=@JoinColumn(name="对方类的外键",
referencedColunName="对方类与外键对应的主键")
)
@ManyToMany(mappedBy="categories")
    public Set<Item> getItems() {
        return items;
    }

@JoinTable(name="relationTable",
            joinColumns={@JoinColumn(name="ITEM_ID",referencedColumnName="ID")},
            inverseJoinColumns={@JoinColumn(name="CATEGORY_ID",referencedColumnName="ID")}
            )
    @ManyToMany
    public Set<Category> getCategories() {
        return categories;
    }

@Test
    public void testMany(){

        Category category=new Category();
        category.setCategory_name("水果");

        Category category2=new Category();
        category2.setCategory_name("食物");

        Item item1= new Item();
        Item item2= new Item();

        item1.setItemName("苹果");
        item2.setItemName("香蕉");

        //设定关系

        category.getItems().add(item1);
        category.getItems().add(item2);


        category2.getItems().add(item1);
        category2.getItems().add(item2);

        item1.getCategories().add(category);
        item1.getCategories().add(category2);


        item2.getCategories().add(category);
        item2.getCategories().add(category2);

        entityManager.persist(item2);
        entityManager.persist(item1);

        entityManager.persist(category);

        entityManager.persist(category2);


    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值