在JPA中持续存在非竞争类型
#java #hibernate #jpa

在这篇文章中,我们将研究如何在JPA中持续非重要数据类型。

通过实现Hibernate或Eclipselink(例如EclipseLink),默认情况下,诸如INT,CHAR,BYTE,String,Boolean或其各自的包装类别(例如INT,CHAR,BYTE,String,Boolean或其各自的包装类别)的原始数据类型会自动映射到正确的数据库类型中。

对于诸如日期和枚举之类的非重要数据类型的情况并非如此。

让我们看看如何持久解决方案。

日期

让我们考虑一个示例,其中我们有一个带有会员变量DOB(出生日期)的学生实体课程。

@Entity
@Table(name = "Student_Table")
public class Student {
    @Id
    @GeneratedValue
    private int id;
    private String admission_no;
    @Column(name = "student_name")
    private String name;
    private int age;
    private Date dob;
}

此处的日期来自 java.util.date package not java.sql.date ,它是Java.util.date软件包的子类。即使SQL日期是最后一个数据库中持续存在的类型,但使用JPA时,UTIL Date类型最喜欢。 UTIL日期提供了一种与JPA中日期合作的标准化方式。 UTIT日期提供毫秒精度的日期和时间。

@temporal注释与日期类型一起使用。 @temporal注释需要类型的颞型单个参数。有三种时间类型日期时间时间戳。让我们看一下它们中的每个吧。

让我们用@temporal emutalType date

查看以前的帖子,以了解如何使用JPA和数据库设置Java项目。

@Entity
@Table(name = "Student_Table")
public class Student {
    @Id
    @GeneratedValue
    private int id;
    private String admission_no;
    @Column(name = "student_name")
    private String name;
    private int age;
    @Temporal(TemporalType.DATE)
    private Date dob;
}

现在将学生实体持续到数据库中。

public class Main {
    public static void main(String[] args) {
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myPersistenceUnit");
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        Student student1 = new Student();
        student1.setName("Sohail Shah");
        student1.setAge(18);
        student1.setAdmission_no("1234");
        student1.setDob(new Date());

        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        //persist the student entity
        entityManager.persist(student1);
        transaction.commit();
        entityManager.close();
        entityManagerFactory.close();
}

tuermaltype.date 仅持续日期。现在检查数据库中的值。

Image description

为了持续时间戳,我们可以将 tuermaltype 更改为时间戳

@Entity
@Table(name = "Student_Table")
public class Student {
    @Id
    @GeneratedValue
    private int id;
    private String admission_no;
    @Column(name = "student_name")
    private String name;
    private int age;
    @Temporal(TemporalType.TIMESTAMP)
    private Date dob;
}

坚持学生实体后,请检查数据库中的值。出生地的日期包含随时间的日期。
Image description

只能持续时间 elemalType termaltype.time

@Entity
@Table(name = "Student_Table")
public class Student {
    @Id
    @GeneratedValue
    private int id;
    private String admission_no;
    @Column(name = "student_name")
    private String name;
    private int age;
    @Temporal(TemporalType.TIME)
    private Date dob;
}

坚持学生实体,在数据库中,我们只能看到时间持续。

Image description

枚举

使用jpa将枚举值持续到数据库列是使用@enumerated注释。 @enumerated注释告诉JPA将枚举值映射到数据库。

让我们向我们的学生实体添加成员变量的学生类型。

public enum StudentType {
    SCHOLARSHIP,
    NON_SCHOLARSHIP
}

@Entity
@Table(name = "Student_Table")
public class Student {
    @Id
    @GeneratedValue
    private int id;
    private String admission_no;
    @Column(name = "student_name")
    private String name;
    private int age;
    @Temporal(TemporalType.TIME)
    private Date dob;
    private StudentType studentType;
}

现在用 @enumerated
注释学生类型成员变量

    @Enumerated
    private StudentType studentType;

就是这样,现在我们可以坚持学生实体并检查数据库。

        Student student1 = new Student();
        student1.setName("Sohail Shah");
        student1.setAge(18);
        student1.setAdmission_no("1234");
        student1.setDob(new Date());
        student1.setStudentType(StudentType.SCHOLARSHIP);

Image description

数据库列中学生类型的值设置为0。这是因为默认情况下,枚举类型设置为序数。当枚举类型设置为序数时,JPA将枚举在枚举类中的位置持续。在我们的示例中,StudentType Enum课程有两个恒定的字符串,奖学金为0和NON_SCHOLARSHIPS。

可以通过将 enumtype 设置为 @enumerated 注释参数中的字符串来更改此行为。让我们现在去做吧。

    @Enumerated(EnumType.STRING)
    private StudentType studentType;

现在坚持学生实体并检查数据库。
Image description
字符串的实际值保存到数据库中。
根据您的需求使用注释参数中的枚举类型

但是要小心在您的实体中使用枚举。如果枚举类型设置为序数,则无法更改枚举类中常数字符串的位置。如果将枚举类型设置为字符串,则可以更改位置,但不能更改其拼写。这两者都会导致数据库中的数据不一致。


关注我:TwitterLinkedInGitHubLinktree