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

本文介绍如何使用Java持久化API (JPA) 实现两个实体之间的双向多对多关联关系。通过示例展示了Category和Item两个实体类的定义及多对多关系的建立方法。

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

一个分类有多个小分类(条目),一个条目属于多个分类,这就形成了多对多的关系。

各实体类如下:

package com.ppl.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="JPA_CATEGORIES")
@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")
	public Set<Item> getItems() {
		return items;
	}

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

package com.ppl.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="JPA_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;
	}

	//使用 @ManyToMany 注解来映射多对多关联关系
	//使用 @JoinTable 来映射中间表
	//1. name 指向中间表的名字
	//2. joinColumns 映射当前类所在的表在中间表中的外键
	//2.1 name 指定外键列的列名
	//2.2 referencedColumnName 指定外键列关联当前表的哪一列
	//3. inverseJoinColumns 映射关联的类所在中间表的外键
	@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;
	}
}

多对多关系需要用到第三张表,不过这张表不需要我们手动创建,JPA会根据我们使用注解配置的来帮我们创建,我们只需要写好上面的两个实体类即可。

JPA创建的第三张表:

	// 多对所的保存
	@Test
	public void testManyToManyPersist() {
		Item i1 = new Item();
		i1.setItemName("i-1");

		Item i2 = new Item();
		i2.setItemName("i-2");

		Category c1 = new Category();
		c1.setCategoryName("C-1");

		Category c2 = new Category();
		c2.setCategoryName("C-2");

		// 设置关联关系
		i1.getCategories().add(c1);
		i1.getCategories().add(c2);

		i2.getCategories().add(c1);
		i2.getCategories().add(c2);

		c1.getItems().add(i1);
		c1.getItems().add(i2);

		c2.getItems().add(i1);
		c2.getItems().add(i2);

		// 执行保存
		entityManager.persist(i1);
		entityManager.persist(i2);
		entityManager.persist(c1);
		entityManager.persist(c2);
	}

查询

对于关联的集合对象,默认使用懒加载的策略

无论查询维护关联关系的一方,还是查询不维护关联关系的一方,SQL语句相同。


	// 对于关联的集合对象, 默认使用懒加载的策略.
	// 使用维护关联关系的一方获取, 还是使用不维护关联关系的一方获取, SQL 语句相同.
	@Test
	public void testManyToManyFind() {
		// Item item = entityManager.find(Item.class, 5);
		// System.out.println(item.getItemName());
		//
		// System.out.println(item.getCategories().size());

		Category category = entityManager.find(Category.class, 1);
		System.out.println(category.getCategoryName());
		System.out.println(category.getItems().size());
	}






===========================。

# 基于YOLOv5与Swin Transformer移位窗口注意力的全场景车辆精准检测系统 本方案构建了一套高精度全场景车辆智能检测系统,核心采用YOLOv5目标检测架构并将主干网络CSPDarknet替换为Swin-Transformer系列。Swin-Transformer通过移位窗口多头自注意力机制,在非重叠局部窗口内计算注意力并实现窗口间信息交互,兼顾全局建模能力与线性计算复杂度。其层级化特征金字塔结构天然适配目标检测任务,窗口大小7×7与移位策略有效捕获交通场景中车辆的全局轮廓与局部细节特征。Swin-Transformer中的Tiny、Small、Base、Large型号表示网络规模,Tiny最轻量适合边缘计算设备快速推理,Large精度最高适合云端复杂场景分析。网络采用ImageNet预训练权重初始化,结合分层冻结策略——冻结Swin-Transformer前三个阶段低层特征层,仅微调第四阶段与检测头,在保持底层特征泛化能力的同时高效适配拥堵路口、高速公路、夜间及恶劣天气等多变交通场景下的车辆检测任务。 数据预处理集成光照校正与增强策略,图像统一缩放置640×640。采用自适应直方图均衡化改善阴影与逆光条件下的车辆可见性,结合随机旋转、水平翻转与Mosaic增强提升小目标与小尺寸车辆检测能力。训练采用CIoU边框损失与焦点分类损失平衡正负样本,配合Swin-Transformer的相对位置偏置与层自适应学习率缩放,采用AdamW优化器与余弦退火学习率调度确保收敛稳定。系统通过混淆矩阵实时监控精准率、召回率、F1分数与mAP@0.5:0.95等指标,针对轿车、卡车、公交车、摩托车、自行车等多类别独立统计并保存最优权重。训练日志以JSON格式记录,支持损失曲线、精度曲线及学习率衰减曲线可视化。 系统提供完整评估管线,涵盖PR曲线、F1-置信度曲线及混淆矩阵
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值