在这篇文章中,我们将研究如何在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 仅持续日期。现在检查数据库中的值。
为了持续时间戳,我们可以将 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;
}
坚持学生实体后,请检查数据库中的值。出生地的日期包含随时间的日期。
只能持续时间 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;
}
坚持学生实体,在数据库中,我们只能看到时间持续。
枚举
使用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);
数据库列中学生类型的值设置为0。这是因为默认情况下,枚举类型设置为序数。当枚举类型设置为序数时,JPA将枚举在枚举类中的位置持续。在我们的示例中,StudentType Enum课程有两个恒定的字符串,奖学金为0和NON_SCHOLARSHIPS。
可以通过将 enumtype 设置为 @enumerated 注释参数中的字符串来更改此行为。让我们现在去做吧。
@Enumerated(EnumType.STRING)
private StudentType studentType;
现在坚持学生实体并检查数据库。
字符串的实际值保存到数据库中。
根据您的需求使用注释参数中的枚举类型
但是要小心在您的实体中使用枚举。如果枚举类型设置为序数,则无法更改枚举类中常数字符串的位置。如果将枚举类型设置为字符串,则可以更改位置,但不能更改其拼写。这两者都会导致数据库中的数据不一致。