热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JPA多对多映射

多对多映射表示集合值关联,其中任何数量的实体可以与其他实体的集合关联。在关系数据库中,一个实体的任何行可以被引用到另一个实体的任意数量的行。完整的项目目录结构如下所示-@ManyT

多对多映射表示集合值关联,其中任何数量的实体可以与其他实体的集合关联。 在关系数据库中,一个实体的任何行可以被引用到另一个实体的任意数量的行。

完整的项目目录结构如下所示 -

@ManyToMany 示例

在这个例子中,我们将创建学生和图书馆之间的多对多关系,以便可以为任何数量的学生发放任何类型的书籍。

这个例子包含以下步骤 -

第1步:com.yiibai.mapping包中创建一个实体类Student.java,包含学生ID(s_id)和学生姓名(s_name),其中包含一个使用@@ManyToMany注解的List类型的Library类对象。

文件:Student.java 的代码如下所示 -

package com.yiibai.mapping;

import java.util.List;

import javax.persistence.*;

@Entity
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int s_id;
    private String s_name;

    @ManyToMany(targetEntity = Library.class)
    private List lib;

    public Student(int s_id, String s_name, List lib) {
        super();
        this.s_id = s_id;
        this.s_name = s_name;
        this.lib = lib;
    }

    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }

    public List getLib() {
        return lib;
    }

    public void ListLib(List lib) {
        this.lib = lib;
    }

    public int getS_id() {
        return s_id;
    }

    public void ListS_id(int s_id) {
        this.s_id = s_id;
    }

    public String getS_name() {
        return s_name;
    }

    public void ListS_name(String s_name) {
        this.s_name = s_name;
    }
}
Java

第2步: 在包含book id(b_id)book name(b_name)@ManyToMany注释的com.yiibai.mapping包下创建另一个实体类Library.java,其中包含List类型的Student类对象。

文件:Library.java 的代码如下所示 -

package com.yiibai.mapping;

import java.util.List;

import javax.persistence.*;

@Entity
public class Library {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int b_id;
    private String b_name;

    @ManyToMany(targetEntity = Student.class)
    private List stud;

    public Library(int b_id, String b_name, List stud) {
        super();
        this.b_id = b_id;
        this.b_name = b_name;
        this.stud = stud;
    }

    public Library() {
        super();
        // TODO Auto-generated constructor stub
    }

    public int getB_id() {
        return b_id;
    }

    public void ListB_id(int b_id) {
        this.b_id = b_id;
    }

    public String getB_name() {
        return b_name;
    }

    public void ListB_name(String b_name) {
        this.b_name = b_name;
    }

    public List getStud() {
        return stud;
    }

    public void ListStud(List stud) {
        this.stud = stud;
    }

}
Java

第3步: 将实体类和其他数据库配置映射到persistence.xml文件中。

文件:persistence.xml 的代码如下所示 -


version="2.1"
    xmlns="http://xmlns.jcp.org/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    name="book_issued">
        >com.yiibai.mapping.Student>
        >com.yiibai.mapping.Library>
        >
            name="javax.persistence.jdbc.driver"
                value="com.mysql.jdbc.Driver" />
            name="javax.persistence.jdbc.url"
                value="jdbc:mysql://localhost:3306/testdb?serverTimezOne=UTC" />
            name="javax.persistence.jdbc.user" value="root" />
            name="javax.persistence.jdbc.password"
                value="123456" />
            name="eclipselink.logging.level" value="SEVERE" />
            name="eclipselink.ddl-generation"
                value="create-or-extend-tables" />
        >
    >

>
XML

com.yiibai.mapping包下创建一个持久化类ManyToManyExample,用于将实体对象与数据保持一致。

文件:ManyToManyExample.java 的代码如下所示 -

package com.yiibai.mapping;

import java.util.ArrayList;

import javax.persistence.*;
import com.yiibai.mapping.Student;
import com.yiibai.mapping.Library;

public class ManyToManyExample {

    public static void main(String[] args) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("books_issued");
        EntityManager em = emf.createEntityManager();

        em.getTransaction().begin();

        Student st1 = new Student(1, "Maxsu", null);
        Student st2 = new Student(2, "Xiaonew", null);

        em.persist(st1);
        em.persist(st2);

        ArrayList> al1 = new ArrayList>();
        ArrayList> al2 = new ArrayList>();

        al1.add(st1);
        al1.add(st2);

        al2.add(st1);
        al2.add(st2);

        Library lib1 = new Library(101, "Data Structure", al1);
        Library lib2 = new Library(102, "DBMS", al2);

        em.persist(lib1);
        em.persist(lib2);

        em.getTransaction().commit();
        em.close();
        emf.close();

    }

}
Java

程序输出结果

程序执行完成后,下面的表格在MySQL工作台下生成。

  • Student表 - 此表包含学生详细信息。要获取数据,请在MySQL中运行select * from student查询。结果如下所示 -
mysql> select * from student;
+------+---------+
| S_ID | S_NAME  |
+------+---------+
|    2 | Xiaonew |
|    1 | Maxsu   |
+------+---------+
2 rows in set
Shell
  • Library表 - 这个表格代表学生和图书库之间的映射。 要获取数据,请在MySQL中运行select * from library查询。结果如下所示 -
mysql> select * from library;
+------+----------------+
| B_ID | B_NAME         |
+------+----------------+
|  102 | DBMS           |
|  101 | Data Structure |
+------+----------------+
2 rows in set
Shell
  • Library_student表 - 此表包含库的详细信息。要获取数据,请在MySQL中运行select * from library_student查询。
mysql> select * from library_student;
+--------------+-----------+
| Library_B_ID | stud_S_ID |
+--------------+-----------+
|          101 |         1 |
|          101 |         2 |
|          102 |         1 |
|          102 |         2 |
+--------------+-----------+
4 rows in set

JPA多对多映射


推荐阅读
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • NX二次开发:UFUN点收集器UF_UI_select_point_collection详解
    本文介绍了如何在NX中使用UFUN库进行点收集器的二次开发,包括必要的头文件包含、初始化和选择点集合的具体实现。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 网络爬虫的规范与限制
    本文探讨了网络爬虫引发的问题及其解决方案,重点介绍了Robots协议的作用和使用方法,旨在为网络爬虫的合理使用提供指导。 ... [详细]
  • [c++基础]STL
    cppfig15_10.cppincludeincludeusingnamespacestd;templatevoidprintVector(constvector&integer ... [详细]
  • 微软推出Windows Terminal Preview v0.10
    微软近期发布了Windows Terminal Preview v0.10,用户可以在微软商店或GitHub上获取这一更新。该版本在2月份发布的v0.9基础上,新增了鼠标输入和复制Pane等功能。 ... [详细]
  • LDAP服务器配置与管理
    本文介绍如何通过安装和配置SSSD服务来统一管理用户账户信息,并实现其他系统的登录调用。通过图形化交互界面配置LDAP服务器,确保用户账户信息的集中管理和安全访问。 ... [详细]
  • ZooKeeper 入门指南
    本文将详细介绍ZooKeeper的工作机制、特点、数据结构以及常见的应用场景,包括统一命名服务、统一配置管理、统一集群管理、服务器动态上下线和软负载均衡。 ... [详细]
  • 自动验证时页面显示问题的解决方法
    在使用自动验证功能时,页面未能正确显示错误信息。通过使用 `dump($info->getError())` 可以帮助诊断和解决问题。 ... [详细]
  • 深入解析HTML5字符集属性:charset与defaultCharset
    本文将详细介绍HTML5中新增的字符集属性charset和defaultCharset,帮助开发者更好地理解和应用这些属性,以确保网页在不同环境下的正确显示。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 本文详细介绍了如何解决DNS服务器配置转发无法解析的问题,包括编辑主配置文件和重启域名服务的具体步骤。 ... [详细]
  • 数字资产量化交易通过大数据分析,以客观的方式制定交易决策,有效减少人为的主观判断和情绪影响。本文介绍了几种常见的数字资产量化交易策略,包括搬砖套利和趋势交易,并探讨了量化交易软件的开发前景。 ... [详细]
  • 自定义滚动条美化页面内容
    当页面内容超出显示范围时,为了提升用户体验和页面美观,通常会添加滚动条。如果默认的浏览器滚动条无法满足设计需求,我们可以自定义一个符合要求的滚动条。本文将详细介绍自定义滚动条的实现过程。 ... [详细]
  • importpymysql#一、直接连接mysql数据库'''coonpymysql.connect(host'192.168.*.*',u ... [详细]
author-avatar
忧伤玫瑰coco_873
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有