JPA之实体之间的关系

news/2025/3/15 7:06:30/

JPA之实体之间的关系

10.1.1实体类创建

注解的应用

@Table,@Entity

@Id+@GeneratedValue指定主键,@Column

P174 实体类编写规范

@Table(name = "t_user")
@Entity(name = "User")
public class User implements Serializable {@Id@GeneratedValue(strategy =GenerationType.AUTO)
    private Integer id;@Column(name = "name",length = 50,unique = false,insertable = true,updatable = true,table = "t_user",nullable = true)
    private String name;
+get和setter方法
+有参无参构造
+toSTring方法    }

10.1.2jap的一对一,一对多,多对多用法

详见10.1.3-10.1.9

10.1.3单向一对一

P188 结合课本的单向一对一进行判断

本人理解的单向一对一的关系是。

往person表插入数据或者是删除数据的时候可以对idcard表进行操作。

但是操作idcard表无论如何也得不到person表的任何信息。

案例:person和身份证实体

  • 通过用户可以找到身份证
  • 通过身份证不能找到用户
  • 关键是关系拥有方如何写

Person的代码:

@Table(name = "person")
@Entity(name="Person")
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "personId")
    private Integer personId;    @Column(name="personName")
    private String personName;
//    ================单项一对一==============
    @OneToOne(optional = true,cascade = CascadeType.ALL)
    @JoinColumn(name = "id_card")
    private IdCard idCard;//构造函数+getter+setter+toString
...
}

IdCard的代码:就是编写一个实体类

@Table(name = "idcard")
@Entity(name="IdCard")
public class IdCard {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "cardId")
    private Integer cardId;    @Column(name="cardName")
    private String cardName;
//构造函数+getter+setter

测试代码:

import com.lxz.demo2.entity.IdCard;
import com.lxz.demo2.entity.Person;import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;public class PersonTest {
    public static void main(String[] args) {
        EntityManagerFactory factory=Persistence.createEntityManagerFactory("MyJPA2");
        EntityManager em=factory.createEntityManager();
        EntityTransaction transaction=em.getTransaction();
        transaction.begin();
        Person person=new Person(null,"李四");
        IdCard idCard=new IdCard(null,"李四身份证号码");
        person.setIdCard(idCard);
        em.persist(person);
        transaction.commit();
    }}

效果图:

10.1.4双向一对一

1.双向一对一

本人理解的双向一对一的关系是。

往person表插入数据或者是删除数据的时候可以对idcard表进行操作。

操作idcard表同样也会操作person表。

1.Person表的代码不变

@Table(name = "t_person")
@Entity(name="Person1")
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "personId")
    private Integer personId;    @Column(name="personName")
    private String personName;
//    ================单项一对一==============
    @OneToOne(optional = true,cascade = CascadeType.ALL)
    @JoinColumn(name = "card_id")
    private IdCard idCard;}

2.IdCard的代码

@Table(name = "t_card")
@Entity(name="IdCard")
public class IdCard {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "cardId")
    private Integer cardId;    @Column(name="cardName")
    private String cardName;
//    =============双向一对一===================
//    mappedBy必须和前面设置的保持一致,idCard是person的属性,所以person表是关系的维护方
    @OneToOne(optional = false,cascade = CascadeType.REFRESH,mappedBy = "idCard")
    private Person person;//构造函数+getter+setter
}

测试代码:

public class PersonTest {
    public static void main(String[] args) {
        EntityManagerFactory factory=Persistence.createEntityManagerFactory("MyJPA2");
        EntityManager em=factory.createEntityManager();
        EntityTransaction transaction=em.getTransaction();
        transaction.begin();
        TPerson person=new TPerson(null,"王五");
        TIdCard idCard=new TIdCard(null,"李四身份证号码");
        person.setIdCard(idCard);
        idCard.settPerson(person);
        em.persist(person);
        em.persist(idCard);
        transaction.commit();
    }}

效果图:

10.1.5单向一对多

3.单向一对多

P193 单向一对多关系

案例:部门和员工的关系就是一对多的关系

  • 外键关联
  • 中间表

1.采用外键关联的方式

  • 创建表

Department表:

Employee表:

  • 创建

  • 测试:

 EntityManagerFactory factory=Persistence.createEntityManagerFactory("MyJPA2");
        EntityManager em=factory.createEntityManager();
        EntityTransaction transaction=em.getTransaction();
        transaction.begin();
        Department department=new Department(null,"媒体部",null);
        Employee employee=new Employee(null,"王五");
        Employee employee2=new Employee(null,"赵六");
        List<Employee> e=new ArrayList<>();
        e.add(employee);
        e.add(employee2);
        department.setEmployees(e);
        em.persist(department);
        transaction.commit();

2.基于中间表方式

案例:学生和选课之间的关系是就是单向一对一,一个学生可以选择多门课程可以形成一个中间表(选课信息表)

基于中间表的方式的区别和基于外键的区别在于配置单方(关系拥有方的时候需要配置中间表)

  • student类

@Table(name = "student")
@Entity(name = "Student")
public class Student implements Serializable {
    @Id
    @GeneratedValue
    @Column(name = "id")
    private Integer id;
    @Column(name = "name")
    private String name;    @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    @JoinTable(name="sc",
            joinColumns={
                    @JoinColumn(name = "student_id", referencedColumnName = "id")}
            ,inverseJoinColumns = {
            @JoinColumn(name = "course_id", referencedColumnName = "id")
    })    List<Course> courses;}

  • Course类:

@Entity(name = "Course")
@Table(name = "course")
public class Course {@Id@GeneratedValue@Column(name = "id")
    private Integer id;@Column(name = "name")
    private String name;}

  • 测试类:

 EntityManagerFactory factory=Persistence.createEntityManagerFactory("MyJPA2");
        EntityManager em=factory.createEntityManager();
        EntityTransaction transaction=em.getTransaction();
        transaction.begin();
        Student student=new Student(null,"张三",null);
        Course c1=new Course(null,"数据库");
        Course c2=new Course(null,"Java");
        List<Course> e=new ArrayList<>();
        e.add(c1);
        e.add(c2);
        student.setCourses(e);
        em.persist(student);
        transaction.commit();

查询测试:

  public static void main(String[] args) {
       EntityManagerFactory factory=Persistence.createEntityManagerFactory("MyJPA2");
       EntityManager em=factory.createEntityManager();
       Query query=em.createQuery("select student from Student student");
       System.out.println(query.getResultList());   }

  • 查多端的

public static void main(String[] args) {
       EntityManagerFactory factory=Persistence.createEntityManagerFactory("MyJPA2");
       EntityManager em=factory.createEntityManager();
       Query query=em.createQuery("select course from Course course");
       System.out.println(query.getResultList());   }

10.1.6单向多对一/

1.单向一对多

10.1.7双向一对多/双向多对一

P193

从一方可以获取多方,从多方可以获取一方

@ManyToOne注解+@OneToMany注解的应用

  • Student类:

@Table(name = "student")
@Entity(name = "Student")
public class Student implements Serializable {@Id@GeneratedValue@Column(name = "id")private Integer id;@Column(name = "name")private String name;@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    List<Course> courses;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public List<Course> getCourses() {return courses;}public void setCourses(List<Course> courses) {this.courses = courses;}public Student() {}public Student(Integer id, String name, List<Course> courses) {this.id = id;this.name = name;this.courses = courses;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", courses=" + courses +'}';}
}

  • Course类

@Entity(name = "Course")
@Table(name = "course")
public class Course {
    @Id
    @GeneratedValue
    @Column(name = "id")
    private Integer id;
    @Column(name = "name")
    private String name;    @ManyToOne
    @JoinTable(name="sc",
            joinColumns={
                    @JoinColumn(name = "course_id", referencedColumnName = "id")}
            ,inverseJoinColumns = {
            @JoinColumn(name = "student_id", referencedColumnName = "id")
    })
     private Student student;}

10.1.8单向多对多

P196

  • Student表

@Entity(name = "Student")
@Table(name = "student")
public class Student {
    @Id
    @GeneratedValue
    private Integer id;
    private String name;
    @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    @JoinTable(name = "sc")
    private Collection<Course> course=new ArrayList();}

  • course表:

@Entity(name = "theCourse")
@Table(name = "course")
public class Course {
    @Id
    @GeneratedValue
    private Integer id;
    private String name;

10.1.9双向多对多

P197

  • Student

@Entity(name = "Student")
@Table(name = "student")
public class Student {
    @Id
    @GeneratedValue
    private Integer id;
    private String name;
    @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    @JoinTable(name = "sc")
    private Collection<Course> courses=new ArrayList();

  • Course

@Entity(name = "theCourse")
@Table(name = "course")
public class Course {
    @Id
    @GeneratedValue
    private Integer id;
    private String name;
    @ManyToMany(mappedBy = "courses",cascade = CascadeType.ALL)
    private Collection<Student> students;

10.1.10jpa单表的增删改查

  • 目录

  • 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<persistence 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">
    <persistence-unit name="MyJPA" transaction-type="RESOURCE_LOCAL">
      <class>com.lxz.demo.entity.User</class>
        <properties>
            <!-- 标准配置方法,适用性高 -->
            <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jdbc?useSSL=false&amp;serverTimezone=GMT"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="root"/>            <!-- hibernate 的配置方法-->
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.hbm2ddl.auto" value="update"/> <!--create,create-drop,update,validate  -->        </properties>
    </persistence-unit>
</persistence>

  • 实体类

@Table(name = "t_user")
@Entity(name = "User")
public class User implements Serializable {
    @Id
    @GeneratedValue(strategy =GenerationType.AUTO)
    private Integer id;
    @Column(name = "name",length = 50,unique = false,insertable = true,updatable = true,table = "t_user",nullable = true)
    private String name;    public Integer getId() {
        return id;
    }    public void setId(Integer id) {
        this.id = id;
    }    public String getName() {
        return name;
    }    public void setName(String name) {
        this.name = name;
    }    public User() {
    }    public User(Integer id, String name) {
        this.id = id;
        this.name = name;
    }    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

  • UserDao类

public class UserDao {
    public boolean add(User user){
        try {
            EntityManagerFactory factory = Persistence.createEntityManagerFactory("MyJPA");
            EntityManager em = factory.createEntityManager();
            EntityTransaction transaction = em.getTransaction();
            transaction.begin();
            em.persist(user);
            transaction.commit();
            em.close();
            factory.close();return true;}catch (Exception e){
            e.printStackTrace();return false;}}    public boolean update(User user){
        try {
            EntityManagerFactory factory = Persistence.createEntityManagerFactory("MyJPA");
            EntityManager em = factory.createEntityManager();
            EntityTransaction transaction = em.getTransaction();
            transaction.begin();
            em.merge(user);
            transaction.commit();
            em.close();
            factory.close();return true;}catch (Exception e){return false;}}
    public boolean delete(Integer id){
        try {
        EntityManagerFactory factory= Persistence.createEntityManagerFactory("MyJPA");
        EntityManager em=factory.createEntityManager();
        EntityTransaction transaction=em.getTransaction();
        transaction.begin();
        User user=new User();
        user=em.find(User.class,id);
        em.remove(user);
        transaction.commit();
        em.close();
        factory.close();return true;}catch (Exception e){return false;}}
    public User findById(Integer id){
        EntityManagerFactory factory= Persistence.createEntityManagerFactory("MyJPA");
        EntityManager em=factory.createEntityManager();
        EntityTransaction transaction=em.getTransaction();
        User user=em.find(User.class,id);
        em.close();
        factory.close();return user;}
    public List<User> findAll(){
        EntityManagerFactory factory= Persistence.createEntityManagerFactory("MyJPA");
        EntityManager em=factory.createEntityManager();
        EntityTransaction transaction=em.getTransaction();
        Query query =em.createQuery("select user from User user");
        List<User> users=query.getResultList();
        em.close();
        factory.close();return users;}
}

  • 测试类

public class UserDaoTest {
    public static void main(String[] args) {
        UserDao userDao=new UserDao();
        System.out.println(userDao.add(new User(null,"add")));
        System.out.println(userDao.update(new User(2,"update")));
        System.out.println(userDao.delete(9));
        System.out.println(userDao.findAll());
        System.out.println(userDao.findById(2));
    }}


http://www.ppmy.cn/news/29093.html

相关文章

手把手搭建springboot项目06-springboot整合RabbitMQ及其原理和应用场景

目录前言工作流程-灵魂画手名词解释交换机类型一、安装1.1 [RabbitMQ官网安装](https://www.rabbitmq.com/download.html)1.2 Docker安装并启动二、食用教程2.1.导入依赖2.2 添加配置2.3 代码实现2.3.1 直连&#xff08;Direct&#xff09;类型2.3.2 引入消息手动确认机制2.3.2…

做软件测试,如何才能实现月入20K?

听我的&#xff0c;测试想要月入20k。 首先你要去大厂&#xff0c;不在大厂起码也得在一线城市&#xff0c;北上广深。 二线城市的话成都、杭州最好。 不然的话想都不要想。 像我之前整理过成都的公司&#xff0c;除了字节跳动、蚂蚁金服、滴滴、美团、京东、平安、字节跳动…

UML建模

主要记录UML中的相关知识&#xff0c;包括类、对象、接口、方法、用例、活动、状态、组件和部署图&#xff0c;详细介绍类之间关系与类图的绘制 文章目录一、UML介绍二、类图类之间的关系依赖关系继承关系实现关系关联关系组合关系聚合关系正文内容&#xff1a; 一、UML介绍 …

MATLAB算法实战应用案例精讲-【优化算法】增强型鲸鱼优化算法(EWOA)(附matlab代码实现)

前言 增强型鲸鱼优化算法(Enhanced Whale Optimization Algorithm,EWOA)是Mohammad H. Nadimi-Shahraki等人于2022年提出的一种改进算法。由于标准的鲸鱼优化算法及其它的改进算法都存在种群多样性低和搜索策略差的问题,因此引入有效的策略来缓解鲸鱼优化算法的这些核心缺点…

C# if break,if continue,if return的区别和使用

故事部分&#xff1a; 现在你肚子饿了&#xff0c;想要去&#xff1a; 1.吃个三菜一汤。 2.吃个蛋糕。 3.喝个奶茶。 结果&#xff0c;你吃饭的时候&#xff0c;吃到一个虫子。 你会有几种做法&#xff1f; 1.把有虫子这道菜拿走&#xff0c;继续吃下一道菜 。 2.算了&#xff…

指针的进阶【下篇】

文章目录&#x1f4c0;8.指向函数指针数组的指针&#x1f4c0;9.回调函数&#x1f4c0;8.指向函数指针数组的指针 &#x1f330;请看代码与注释&#x1f447; int Add(int x, int y) {return x y; } int Sub(int x, int y) {return x - y; } int main() {int (*pf)(int, int…

VMware NSX 4.1 发布 - 网络安全虚拟化平台

请访问原文链接&#xff1a;VMware NSX 4 - 网络安全虚拟化平台&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org VMware NSX 提供了一个敏捷式软件定义基础架构&#xff0c;用来构建云原生应用程序环境。NSX 专注于为具有异…

Allegro如何设置铜皮避让的优先级操作指导

Allegro如何设置铜皮避让的优先级操作指导 在用Allegro进行PCB设计的时候,时常需要使用动态铜皮进行设计,当两块动态铜皮存在交集的时候,避让就会存在一个优先级,如下图 上方的铜皮避让调了下方的铜皮,上方的铜皮被避让了 如何调整让下方的铜皮避让上方的铜皮,如下图 具…