多对多关系映射

来源:互联网 发布:nvidia cuda windows 编辑:程序博客网 时间:2024/05/18 03:41

个人总结

  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);    }
原创粉丝点击