定义 JPA 实体
admin
2024-03-23 15:03:02
0

1. 简介

在本教程中,我们将了解实体的基础知识,以及在 JPA 中定义和自定义实体的各种注释。

2. 实体

JPA 中的实体只不过是表示可以持久保存到数据库的数据的 POJO。实体表示存储在数据库中的表。实体的每个实例都表示表中的一行。

2.1. 实体注释

假设我们有一个名为 Student 的 POJO,它表示学生的数据我们希望将其存储在数据库中:

public class Student {// fields, getters and setters}

为了做到这一点,我们应该定义一个实体,以便JPA知道它。

因此,让我们通过使用@Entity注释来定义它。我们必须在类级别指定此注释。我们还必须确保实体具有 no-arg 构造函数和主键:

@Entity
public class Student {// fields, getters and setters}

实体名称默认为类的名称。我们可以使用 name 元素更改它的名称:

@Entity(name="student")
public class Student {// fields, getters and setters}

因为各种 JPA 实现会尝试对我们的实体进行子类化以提供它们的功能,所以实体类不能被声明为 final

2.2. ID 注释

每个 JPA 实体都必须有一个唯一标识它的主键。@Id注释定义主键。我们可以通过不同的方式生成标识符,这些标识符由@GeneratedValue注释指定。

我们可以从四种带有策略元素的 id 生成策略中进行选择。该值可以是自动、表、序列标识:

@Entity
public class Student {@Id@GeneratedValue(strategy=GenerationType.AUTO)private Long id;private String name;// getters and setters
}

如果我们指定生成类型AUTO,JPA 提供程序将使用它想要生成标识符的任何策略。

如果我们注释实体的字段,JPA 提供程序将使用这些字段来获取和设置实体的状态。除了字段访问之外,我们还可以进行属性访问或混合访问,这使我们能够在同一实体中同时使用字段和属性访问

2.3. 表格注释

在大多数情况下,数据库中表的名称和实体的名称不会相同。

在这些情况下,我们可以使用@Table注释指定表名:

@Entity
@Table(name="STUDENT")
public class Student {// fields, getters and setters}

我们还可以使用架构元素提及架构

@Entity
@Table(name="STUDENT", schema="SCHOOL")
public class Student {// fields, getters and setters}

架构名称有助于将一组表与另一组表区分开来。

如果我们不使用@Table注释,则表的名称将是实体的名称。

2.4. 列注释

就像@Table注释一样,我们可以使用@Column注释来提及表中列的详细信息。

@Column注释具有许多元素,例如名称、长度、可为空和唯一

@Entity
@Table(name="STUDENT")
public class Student {@Id@GeneratedValue(strategy=GenerationType.AUTO)private Long id;@Column(name="STUDENT_NAME", length=50, nullable=false, unique=false)private String name;// other fields, getters and setters
}

name 元素指定表中列的名称。长度元素指定其长度。可为空元素指定列是否可为空,唯一元素指定列是否唯一

如果我们不指定此注释,则表中列的名称将是字段的名称。

2.5. 瞬态注释

有时,我们可能希望使字段非持久性。 我们可以使用@Transient注释来做到这一点。它指定不会保留该字段。

例如,我们可以从出生之日起计算学生的年龄。

因此,让我们用@Transient注释来注释字段年龄

@Entity
@Table(name="STUDENT")
public class Student {@Id@GeneratedValue(strategy=GenerationType.AUTO)private Long id;@Column(name="STUDENT_NAME", length=50, nullable=false)private String name;@Transientprivate Integer age;// other fields, getters and setters
}

因此,字段年龄不会保留到表中。

2.6. 时间标注

在某些情况下,我们可能必须在表中保存时态值。

为此,我们有@Temporal注释:

@Entity
@Table(name="STUDENT")
public class Student {@Id@GeneratedValue(strategy=GenerationType.AUTO)private Long id;@Column(name="STUDENT_NAME", length=50, nullable=false, unique=false)private String name;@Transientprivate Integer age;@Temporal(TemporalType.DATE)private Date birthDate;// other fields, getters and setters
}

但是,在JPA 2.2中,我们还支持java.time.LocalDate,java.time.LocalTime,java.time.LocalDateTime,java.time.OffsetTime和java.time.OffsetDateTime

2.7. 枚举注释

有时,我们可能希望持久化 Java 枚举类型。

我们可以使用@Enumerated注释来指定枚举是按名称还是按序号(默认)持久化:

public enum Gender {MALE, FEMALE
}
@Entity
@Table(name="STUDENT")
public class Student {@Id@GeneratedValue(strategy=GenerationType.AUTO)private Long id;@Column(name="STUDENT_NAME", length=50, nullable=false, unique=false)private String name;@Transientprivate Integer age;@Temporal(TemporalType.DATE)private Date birthDate;@Enumerated(EnumType.STRING)private Gender gender;// other fields, getters and setters
}

实际上,如果我们要按枚举的序数保留性别,我们根本不需要指定@Enumerated注释。

但是,为了保留按枚举名称划分的性别,我们使用 EnumType.STRING 配置了注释。

3. 结论

在本文中,我们学习了什么是 JPA 实体以及如何创建它们。我们还了解了可用于进一步自定义实体的不同注释。

本文的完整代码可以在Github上找到。

相关内容

热门资讯

女朋友快生日了我不在她身边想说... 女朋友快生日了我不在她身边想说几句浪漫点得祝福语,请各位帮忙...亲爱的,距离永远阻挡不了我对你爱,...
我18岁了,想献血,请问献血有... 我18岁了,想献血,请问献血有什么规定?无传染性疾病
即便心再痛,也愿意因为爱而停下... 即便心再痛,也愿意因为爱而停下来等待前任回头的星座有哪些?摩羯座,金牛座还有白羊座就这个星座他是非常...
第一个字是从的成语大全,从字开... 第一个字是从的成语大全,从字开头的四字词语 第一个字是从的成语大全 从容应对、 从容自若、 从天...
谁能给我紫藤萝瀑布课后练习第1... 谁能给我紫藤萝瀑布课后练习第1题的答案!自己写。原先,焦虑和悲痛“一直压在我心上”,在繁花盛开的藤萝...
冷笑话的定义是什么? 冷笑话的定义是什么?怎么样的话才算冷笑话?不好笑的笑话吧.定义1:就是讲的人挺平静的,基本上面无表情...
感觉自己失去了目标,现在不知道... 感觉自己失去了目标,现在不知道该怎么生存下去了。人生中没有一帆风顺,现成的路可走,总会遇到一些困难,...
我都24了,还没有男朋友,我真... 我都24了,还没有男朋友,我真的很慌。怎么办?身边也没有男生说喜欢我你愿意网恋吗缘分 不要宅在家里那...
我有一个朋友,我们总是出去玩,... 我有一个朋友,我们总是出去玩,喝酒。但是他每次出来都要炫耀他赚了多少钱,我觉得他很爱炫,我就不想和炫...
林永健拍过什么电视剧 林永健拍过什么电视剧金婚喜耕田的故事城里城外马文的战争
斑马s6有必要学吗 斑马s6有必要学吗有。1、激发兴趣:通过有趣的故事、游戏和其他互动活动,斑马儿童英语S6可以激发孩子...
甜蜜乐章 撮合不了子奇和慕容啊... 甜蜜乐章 撮合不了子奇和慕容啊~~~~!必须是金曲奖的最佳演唱人,不然触发不了
暮光之城3 暮光之城3现在没有出呢!有也是骗人的!起码要国内上映之后吧!我和你一样期待呢!
学生会查寝收走了东西,要用什么... 学生会查寝收走了东西,要用什么法律武器把收走的东西要回来?和学校讲法律,劝你还是别这么冲动了。拿到明...
信任无价主要讲了一个什么故事 信任无价主要讲了一个什么故事主要讲了:一位女老师通过绝食的办法,让那位偷了快译通的学生自己主动交出。
什么叫奴隶社会 什么叫奴隶社会 奴隶社会:从公元前21世纪夏朝建立开始,到公元前221年秦王嬴政统一中国结束。[1...
中级经济师人力资源专业怎么才能... 中级经济师人力资源专业怎么才能考过啊?只是看指定的那两本书《经济基础》和《人力资源管理》,然后再把上...
为什么海里都是水啊 为什么海里都是水啊海里没水 海就不叫海了不难怎么叫海水 嘿嘿。海里没水 海就不叫海了
14岁两个女生,一米深的河里手... 14岁两个女生,一米深的河里手绑手溺亡,疑点重重,怎么回事?这个是因为她们忍受不了家里面的重男轻女,...
帮解几道五年级数学题!急急急~... 帮解几道五年级数学题!急急急~快快快!(要解)52=2*2*13