📜  JPA-高级映射(1)

📅  最后修改于: 2023-12-03 15:02:09.068000             🧑  作者: Mango

JPA-高级映射

简介

Java Persistence API(JPA)是Java EE的一部分,用于管理Java对象与数据库之间的映射关系。JPA提供了一种对象关系映射(ORM)的方式,让开发人员可以通过简单的注解来定义实体类与数据库表之间的映射关系。

JPA的高级映射功能提供了更灵活的映射选项,用于处理一些特殊需求,例如继承关系、多对多关系、枚举类型映射等。

本文将介绍JPA高级映射的一些常见用法和示例。

目录
单继承映射

单继承映射是指一个实体类继承另一个实体类,并且只有一个子类与父类对应。在数据库中,通常使用一个表来表示这种关系。

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING)
public class Vehicle {
    // 父类属性
}

@Entity
@DiscriminatorValue("CAR")
public class Car extends Vehicle {
    // 子类属性
}

@Entity
@DiscriminatorValue("BIKE")
public class Bike extends Vehicle {
    // 子类属性
}

上述代码中,Vehicle是父类实体,CarBike是子类实体。通过@Inheritance注解指定继承类型为SINGLE_TABLE,表示使用单表继承映射策略。@DiscriminatorColumn注解定义了一个用于区分不同子类的列,@DiscriminatorValue注解指定了子类实体在该列中的值。

多继承映射

多继承映射是指一个实体类同时继承多个实体类。在数据库中,通常使用额外的关联表来表示这种关系。

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class User {
    // 父类属性
}

@Entity
public class Customer extends User {
    // 子类属性
}

@Entity
public class Employee extends User {
    // 子类属性
}

上述代码中,User是父类实体,CustomerEmployee是子类实体。通过@Inheritance注解指定继承类型为JOINED,表示使用多表继承映射策略。每个子类实体都会有一个额外的表来存储自己的属性,同时通过外键与父类实体关联起来。

多对多映射

多对多映射是指两个实体类之间存在多对多的关系。在数据库中,通常使用关联表来表示这种关系。

@Entity
public class Student {
    @Id
    private Long id;
    private String name;
    @ManyToMany
    @JoinTable(name = "student_course",
            joinColumns = @JoinColumn(name = "student_id"),
            inverseJoinColumns = @JoinColumn(name = "course_id"))
    private List<Course> courses;
}

@Entity
public class Course {
    @Id
    private Long id;
    private String name;
    @ManyToMany(mappedBy = "courses")
    private List<Student> students;
}

上述代码中,StudentCourse是多对多关系的两个实体类。通过@ManyToMany注解标记两个实体类之间的关系,同时使用@JoinTable注解定义关联表的名称和关联字段。mappedBy属性表示由另一个实体类来维护关联关系。

枚举类型映射

枚举类型映射是指将Java枚举类型与数据库中的某种数据类型或表达方式进行映射。

@Entity
public class Product {
    @Id
    private Long id;
    private String name;
    @Enumerated(EnumType.STRING)
    private Category category;
}

public enum Category {
    ELECTRONICS,
    CLOTHING,
    BOOKS;
}

上述代码中,Product实体类中的category属性使用@Enumerated注解来实现枚举类型的映射。EnumType.STRING表示将枚举类型作为字符串保存在数据库中。

以上是JPA高级映射的一些常见用法和示例。通过灵活运用JPA的高级映射功能,可以更好地处理特殊的数据映射需求,提高开发效率和便利性。

参考链接