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); } }

jpa 多对多的更多相关文章

  1. JPA多对多关联

    关于JPA多对多关系,这是使用学生与教师来表示.一个Student由多个Teacher教,同样一个Teacher也可以教多个学生.Student类如下: package com.yichun.bean ...

  2. JPA多对一单向关联

    在实际开发过程中,JPA多对一单向关联是使用最多的关联方式. 下面是订单与订单项的配置关系. 订单(Order):一的一方,不进行任何配置 @Entity @Table(name="orde ...

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

    维护端注解 @ManyToMany (cascade = CascadeType.REFRESH) @JoinTable (//关联表 name = "student_teacher&quo ...

  4. spring data jpa 多对多查询

    package com.ytkj.dao; import com.ytkj.entity.Customer; import com.ytkj.entity.Role; import org.sprin ...

  5. spring data jpa 多对多 ManyToMany

    环境搭建 源码地址:gitee:https://gitee.com/ytfs-dtx/JPA 导入依赖 <properties> <spring.version>5.2.5.R ...

  6. jpa 多对多关系的实现注解形式

    1, 表结构 1)设备表 VTM_DEVICE_INFO create table VTM_DEVICE_INFO ( ID INTEGER not null, SN ) not null, STAT ...

  7. jpa多对一映射

    1.插入 建一个部门类Dept和一个员工类Emp: Emp对Dept是多对一的关系:因为一个部门有多个员工,而一个员工只有一个部门:   Emp类中添加一个Dept的属性: @ManyToOne注解表 ...

  8. Hibernate JPA 关联关系

    Hibernate JPA 关联关系: 使用cascade做级联操作(只有在满足数据库约束时才会生效): CascadeType.PERSIST: 级联保存,只有调用persist()方法,才会级联保 ...

  9. JPA中遇到一些异常的分析与解决

    Spring Data JPA踩坑到填坑:1 JPA多对多关 //作者表 //书籍表 Book和Author是多对多关系 先放两张图做个说明:Jpa底层依赖于hibernate,hibernate默认 ...

随机推荐

  1. 杭电 KazaQ's Socks

    KazaQ wears socks everyday. At the beginning, he has n pairs of socks numbered from 1 to n in his cl ...

  2. STS或eclipse安装SVN插件(转)

    安装sts--SVN插件 简介:sts是与eclipse类似的Java IDE开发工具(不了解的百度) 1.sts菜单栏 help->install New Software 依据大家的版本选择 ...

  3. ehci及其伴随ohci主机控制器驱动分析

    1. 正常插入 插上U盘产生中断调用usb_hcd_irq: usb_hcd_irq ehci_irq usb_hcd_resume_root_hub queue_work(pm_wq, &h ...

  4. 一个简单的批量更新oracle 数据库中 最近的服务商名称的数据

    有一个需求是这样的,我们需要更新数据库中的数据,数据时这样的 1.大约50万以上 2. 数据中有较多的重复数据 3. 需要将表中最近的代理商的名称赋值给行中的服务商名称 4. 代理商的名称可能有多个, ...

  5. java 多线程之 线程优先级和守护线程

    线程优先级的介绍 java 中的线程优先级的范围是1-10,默认的优先级是5."高优先级线程"会优先于"低优先级线程"执行. java 中有两种线程:用户线程和 ...

  6. linq to sql 项目移植后,数据库实体类需要重新创建?

    项目中,使用LINQ to SQL 访问数据库,代码移植到其他机器上,每次需要重新生成dbml文件,有无方法只要更改app.config呢? 经过试验是可行的: 1.引用system.configur ...

  7. ML(3): 贝叶斯方法

    对于分类问题,我们每个人每天都在执行分类操作,只是我们没有意识到罢了.例如,当你看到一个陌生人,你的脑子下意识判断TA是男是女:你可能经常会走在路上对身旁的朋友说“这个人一看就很有钱.那边有个非主流” ...

  8. Django mark_safe

    不用mark_safe: 用mark_safe: 用法: from django.shortcuts import render from django.utils.safestring import ...

  9. robots写法及相关命令介绍

    当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在,搜索机器人就会按照该文件中的内容来确定访问 的范围:如果该文件不存在,所有的搜索蜘蛛将能够访问网站上所有 ...

  10. 复分析可视化方法:笔记:log(z)的可视化微分法

    当z转过θ时,我们来看看发生了什么: 左图中的空心箭头代表z的变化量,其长度为rδ,方向为pi/2+θ: 右图中的实心箭头代表log(z)的变化量,其长度为δ,方向为pi/2. 因此,从左图空心箭头到 ...