JPA-映射双向多对多关联关系

不维护关联关系的一端

@Entity
@Table(name="item")
public class Item {
    
    private Integer id;
    private String itemname;
    private Set<Category> items=new HashSet<>();
    
    @Id
    @GeneratedValue
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getItemname() {
        return itemname;
    }
    public void setItemname(String itemname) {
        this.itemname = itemname;
    }
    
    @ManyToMany(mappedBy="categories")
    public Set<Category> getItems() {
        return items;
    }
    public void setItems(Set<Category> items) {
        this.items = items;
    } 
}
维护关联关系的一端

@Entity
@Table(name="category")
public class Category {
    
    private Integer id;
    private String categoryname;
    private Set<Item> categories=new HashSet<>();
    
    @Id
    @GeneratedValue
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getCategoryname() {
        return categoryname;
    }
    public void setCategoryname(String categoryname) {
        this.categoryname = categoryname;
    }
    
    //使用@ManyToMany 来映射多对多关联关系
    //使用@JoinTable 来映射中间表
    //1.name 指向中间表的名字
    //2.joinColumns 映射当前类所在的表在中间表的外键
    //2.1 name指定外键列的列名
    //2.2 referencedColumnName指定外键列关联当前表的哪一列
    //3.inverseJoinColumns 映射关联的类在中间表的外键
    @ManyToMany
    @JoinTable(name="category_item",
    joinColumns={@JoinColumn(name="category_id",referencedColumnName="id")},
    inverseJoinColumns={@JoinColumn(name="item_id",referencedColumnName="id")})
    public Set<Item> getCategories() {
        return categories;
    }
    public void setCategories(Set<Item> categories) {
        this.categories = categories;
    }
}
@Tset

public class JPATest {

    private EntityManager entityManager;
    private EntityTransaction transaction;
    private EntityManagerFactory entityManagerFactory;

    @Before
    public void setUp() throws Exception {
        entityManagerFactory = Persistence.createEntityManagerFactory("jpa-1");
        entityManager = entityManagerFactory.createEntityManager();
        transaction = entityManager.getTransaction();
        transaction.begin();
    }

    @After
    public void destroy() {
        transaction.commit();
        entityManager.close();
        entityManagerFactory.close();
    }
    
    //对于关联的集合对象,默认使用懒加载策略
    //获取维护关联关系的一端还是不维护关联关系的一端,SQL语句相同
    @Test
    public void testManyToManyFind(){
        Item item = entityManager.find(Item.class, 1);
        System.out.println(item.getItemname());
        System.out.println(item.getItems().size());
        
        Category category = entityManager.find(Category.class, 1);
        System.out.println(category.getCategoryname());
        System.out.println(category.getCategories().size());
    }
    
    //多对多的保存
    @Test
    public void testManyToManyPersist(){
        Item i1 = new Item();
        Item i2 = new Item();
        i1.setItemname("i1");
        i2.setItemname("i2");
        Category c1 = new Category();
        Category c2 = new Category();
        c1.setCategoryname("c1");
        c2.setCategoryname("c2");
        //设置关联关系
        i1.getItems().add(c1);
        i1.getItems().add(c2);
        i2.getItems().add(c1);
        i2.getItems().add(c2);
        c1.getCategories().add(i1);
        c1.getCategories().add(i2);
        c2.getCategories().add(i1);
        c2.getCategories().add(i2);
        //执行保存操作
        entityManager.persist(i1);
        entityManager.persist(i2);
        entityManager.persist(c1);
        entityManager.persist(c2);
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值