jpa 多对多

entity   Item

package entity;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Table(name = "tb_items")
@Entity
public class Item {
    private Integer id;
    private String itemName;
    /**
     * 多对多的关系
     */
    private Set<Category> categories = new HashSet<>();

    @GeneratedValue
    @Id
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Column(name = "ITEM_NAME")
    public String getItemName() {
        return itemName;
    }

    public void setItemName(String itemName) {
        this.itemName = itemName;
    }

    // joinColumns:指定自己的外键和中间表之关联的之列
    // @JoinColumn(name="ITEM_ID" 中间表的外键
    // referencedColumnName="ID"  自己的主键
    // ****inverseJoinColumns:指定与之相关表的外键和与之关联的之列
    //name="ITEM_CATEGORY":指定中间表的表名
    @JoinTable(name="ITEM_CATEGORY",
       joinColumns = { @JoinColumn(name = "ITEM_ID", referencedColumnName = "ID") },
       inverseJoinColumns = {@JoinColumn(name = "CATEGORY_ID", referencedColumnName = "ID") })
    @ManyToMany
    public Set<Category> getCategories() {
        return categories;
    }

    public void setCategories(Set<Category> categories) {
        this.categories = categories;
    }

    @Override
    public String toString() {
        return "Item [id=" + id + ", itemName=" + itemName + ", categories=" + categories + "]";
    }

}

entity  Category

package entity;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Table(name="TB_CATEGORY")
@Entity
public class Category {
    private Integer id;
    private String categoryName;

    private Set<Item> items = new HashSet<>();

    @GeneratedValue
    @Id
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
    @Column(name="CATEGORY_NAME")
    public String getCategoryName() {
        return categoryName;
    }

    public void setCategoryName(String categoryName) {
        this.categoryName = categoryName;
    }

     //多对多的关系
    @ManyToMany(mappedBy="categories")  //放弃维护关系,有item维护
    public Set<Item> getItems() {
        return items;
    }

    public void setItems(Set<Item> items) {
        this.items = items;
    }

    @Override
    public String toString() {
        return "Category [id=" + id + ", categoryName=" + categoryName + ", items=" + items + "]";
    }

}

testManyToMany

package test;

import java.util.Set;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import entity.Category;
import entity.Item;

public class ManyToManyTest {

    private EntityManagerFactory entityManagerFactory;
    private EntityManager entityManager;
    private EntityTransaction entityTransaction;

    @Before
    public void init() {
        entityManagerFactory = Persistence.createEntityManagerFactory("JPA");
        entityManager = entityManagerFactory.createEntityManager();
        entityTransaction = entityManager.getTransaction();
        entityTransaction.begin();
    }

    @After
    public void distory() {
        entityTransaction.commit();
        entityManager.close();
        entityManagerFactory.close();

    }

    @Test
    public void testFind(){
        //使用关系不维护的一方获取,
        Category category = entityManager.find(Category.class, 27);
        Set<Item> items = category.getItems();
        for (Item item : items) {
            System.out.println(item.getItemName());
        }

//        //对于关联的对象默认使用懒加载  ,使用关系维护的 一方获取还是使用关系不维护的一方获取,sql语句相同
//         Item item = entityManager.find(Item.class, 25);
//        Set<Category> categories = item.getCategories();
//        for (Category category : categories) {
//            System.out.println(category.getCategoryName());
//        }

    }

    @Test
    public void testmanyToManyPersistence() {
        Category category1 = new Category();
        category1.setCategoryName("c1");
        Category category2 = new Category();
        category2.setCategoryName("c2");

        Item item1 = new Item();
        item1.setItemName("i1");
        Item item2 = new Item();
        item1.setItemName("i2");

        //给予关系
        category1.getItems().add(item1);
        category1.getItems().add(item2);
        category2.getItems().add(item1);
        category2.getItems().add(item2);

        item1.getCategories().add(category1);
        item1.getCategories().add(category2);
        item2.getCategories().add(category1);
        item2.getCategories().add(category2);
        //持久化
        entityManager.persist(item1);
        entityManager.persist(item2);
        entityManager.persist(category1);
        entityManager.persist(category2);

    }

}

原文地址:https://www.cnblogs.com/lshan/p/8647506.html

时间: 2024-10-17 08:55:05

jpa 多对多的相关文章

JPA多对多@manytomany注解配置实例

维护端注解 @ManyToMany (cascade = CascadeType.REFRESH) @JoinTable (//关联表 name = "student_teacher" , //关联表名 inverseJoinColumns = @JoinColumn (name = "teacher_id" ),//被维护端外键 joinColumns = @JoinColumn (name = "student_id" ))//维护端外键 被

JPA多对多注解

顺序不能更改,这样多对多是针对photos. /*图片*/    private Set<PhtotEntity> phtots = new HashSet<PhtotEntity>();        /**     * 获取软件图片相册信息     *      * @return 图片相册信息     */    @ManyToMany(cascade={CascadeType.ALL})      @JoinTable(name="cca_goodsdc_phot

JPA多对多

? 在双向多对多关系中,我们必须指定一个关系维护端(owner side),可以通过 @ManyToMany 注释中指定 mappedBy 属性来标识其为关系维护端. @ManyToMany @JoinTable(name="中间表名称", [email protected](name="本类的外键", referencedColumnName="本类与外键对应的主键"), [email protected]Column(name="对

JPA多对多映射

多对多映射表示集合值关联,其中任何数量的实体可以与其他实体的集合关联. 在关系数据库中,一个实体的任何行可以被引用到另一个实体的任意数量的行. 完整的项目目录结构如下所示 - @ManyToMany 示例 在这个例子中,我们将创建学生和图书馆之间的多对多关系,以便可以为任何数量的学生发放任何类型的书籍. 这个例子包含以下步骤 - 第1步: 在com.yiibai.mapping包中创建一个实体类Student.java,包含学生ID(s_id)和学生姓名(s_name),其中包含一个使用@@Ma

JPA学习笔记(7)——映射多对一关联关系

多对一关联关系 两个实体类,User和Order,一个User可以有多个Order,一个Order只能有一个User 建立关联关系 使用@ManyToOne注解映射多对一关联关系 User实体类 package com.jpa.helloworld; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.pers

JPA学习---第十一节:JPA中的多对多双向关联实体定义与注解设置及操作

1.定义实体类,代码如下: (1).学生实体类: package learn.jpa.entity; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import

JPA一对多和多对一关系

1-m:多的一方为关系维护端,关系维护端负责外键纪录的更新,关系被维护端没有权力更新外键纪录. 维护端注解 Java代码   @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE, CascadeType.REMOVE }, fetch = FetchType.EAGER, mappedBy = "order") 被维护端注解 Java代码   @ManyToOne(casc

JPA学习笔记(10)——映射双向多对多关联关系

多对多关联 比如现在有两个实体类:1. Product(商品)2. Category(类别) 一个商品可以有多个类别,一个类别也可以有多个商品,这就形成了多对多的关系 Product package com.jpa.helloworld2; import java.util.List; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue;

Jpa 对多对多实现、懒加载

参考:https://www.jianshu.com/p/91d3096f38a0 实体:Device  与 Group 是多对多的关系 Group 维护端: @Data @Entity(name = "t_group") public class Group extends BaseEntity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @Column(name = "c