我是靠谱客的博主 甜美柚子,这篇文章主要介绍JPA教程:映射实体–第1部分,现在分享给大家,希望可以做个参考。

在本文中,我将讨论JPA中的实体映射过程。 至于我的示例,我将使用与 我以前的一篇文章中使用的模式相同的模式 。

在前两篇文章中,我解释了如何在Java SE环境中设置JPA。 我不打算为Web应用程序编写安装过程,因为Web上的大多数教程都完全做到了这一点。 因此,让我们直接跳过对象关系映射或实体映射。

Wikipedia定义对象关系映射如下:

计算机科学中的对象关系映射(ORM,O / RM和O / R映射)是一种编程技术,用于在面向对象编程语言中的不兼容类型系统之间转换数据。 实际上,这会创建一个“虚拟对象数据库”,可以在编程语言中使用它。 尽管有些程序员选择创建自己的ORM工具,但有执行对象关系映射的免费和商业软件包。

通常,映射是您将有关数据库的必要信息提供给ORM工具的过程。 然后,该工具使用此信息将对象读/写到数据库中。 通常,您告诉您的ORM工具表名称,特定类型的对象将保存到该表名称。 您还提供了对象属性将映射到的列名。 还需要指定不同对象类型之间的关系。 所有这些似乎都是很多任务,但是幸运的是,JPA遵循所谓的“ Convention over Configuration”方法,这意味着如果您采用JPA提供的默认值,则只需配置很少的部分应用程序。

为了在JPA中正确映射类型,您至少需要执行以下操作:

  1. 用@Entity批注标记您的课程。 这些类称为实体。
  2. 用@Id注释标记类的属性/获取方法之一。

就是这样。 您的实体已准备好保存到数据库中,因为JPA会自动配置映射的所有其他方面。 这也显示了使用JPA可以享受的生产率提高。 您无需在每次查询数据库时手动填充对象,从而避免编写大量样板代码。

让我们来看一个例子。 考虑以下我根据以上两个规则映射的地址实体:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import javax.persistence.Entity; import javax.persistence.Id; @Entity public class Address { @Id private Integer id; private String street; private String city; private String province; private String country; private String postcode; /** * @return the id */ public Integer getId() { return id; } /** * @param id the id to set */ public Address setId(Integer id) { this.id = id; return this; } /** * @return the street */ public String getStreet() { return street; } /** * @param street the street to set */ public Address setStreet(String street) { this.street = street; return this; } /** * @return the city */ public String getCity() { return city; } /** * @param city the city to set */ public Address setCity(String city) { this.city = city; return this; } /** * @return the province */ public String getProvince() { return province; } /** * @param province the province to set */ public Address setProvince(String province) { this.province = province; return this; } /** * @return the country */ public String getCountry() { return country; } /** * @param country the country to set */ public Address setCountry(String country) { this.country = country; return this; } /** * @return the postcode */ public String getPostcode() { return postcode; } /** * @param postcode the postcode to set */ public Address setPostcode(String postcode) { this.postcode = postcode; return this; } }

现在,根据您的环境,您可能会或可能不会在persistence.xml文件中添加此实体声明,我在上一篇文章中已经对此进行了解释。

好吧,让我们保存一些对象! 以下代码段正是这样做的:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import com.keertimaan.javasamples.jpaexample.entity.Address; import javax.persistence.EntityManager; import com.keertimaan.javasamples.jpaexample.persistenceutil.PersistenceManager; public class Main { public static void main(String[] args) { EntityManager em = PersistenceManager.INSTANCE.getEntityManager(); Address address = new Address().setId(1) .setCity("Dhaka") .setCountry("Bangladesh") .setPostcode("1000") .setStreet("Poribagh"); em.getTransaction() .begin(); em.persist(address); em.getTransaction() .commit(); System.out.println("addess is saved! It has id: " + address.getId()); Address anotherAddress = new Address().setId(2) .setCity("Shinagawa-ku, Tokyo") .setCountry("Japan") .setPostcode("140-0002") .setStreet("Shinagawa Seaside Area"); em.getTransaction() .begin(); em.persist(anotherAddress); em.getTransaction() .commit(); em.close(); System.out.println("anotherAddress is saved! It has id: " + anotherAddress.getId()); PersistenceManager.INSTANCE.close(); } }

现在让我们退后一步,想一想如果使用纯JDBC进行持久化,我们需要做什么。 对于这两种情况,我们必须手动编写插入查询并将每个属性映射到相应的列,这将需要大量代码。

关于示例需要注意的重要一点是我设置实体ID的方式。 这种方法仅适用于像这样的简短示例,但是对于实际应用而言,这不是很好。 通常,您通常希望使用自动递增的id列或数据库序列来生成实体的id值。 在我的示例中,我使用的是MySQL数据库,并且我所有的id列均设置为自动递增。 为了在我的实体模型中反映出这一点,我可以在id属性中使用一个名为@GeneratedValue的附加注释。 这告诉JPA,该实体的id值将在插入期间由数据库自动生成,并且应该在插入之后使用select命令获取该id。

经过上述修改,我的实体类变成了这样的东西:

复制代码
1
2
3
4
5
6
7
8
9
10
11
import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.GeneratedValue; @Entity public class Address { @Id @GeneratedValue private Integer id; // Rest of the class code........

插入过程变为:

复制代码
1
2
3
4
5
6
7
8
9
10
Address anotherAddress = new Address() .setCity("Shinagawa-ku, Tokyo") .setCountry("Japan") .setPostcode("140-0002") .setStreet("Shinagawa Seaside Area"); em.getTransaction() .begin(); em.persist(anotherAddress); em.getTransaction() .commit();

JPA如何确定用于保存地址实体的表? 事实证明,这很简单:

  1. 如果映射未提供任何明确的表信息,则JPA会尝试查找名称与实体名称匹配的表。
  2. 可以使用@Entity批注的“名称”属性显式指定实体的名称。 如果未找到名称属性,则JPA会假定实体的默认名称。
  3. 实体的默认名称是实体类的简单名称(非完全限定名称),在我们的情况下为Address。 因此,我们的实体名称随后被确定为“地址”。
  4. 由于我们的实体名称为“地址”,因此JPA会尝试查找数据库中是否存在名称为“地址”的表(请记住,大多数情况下数据库表名称均不区分大小写)。 从我们的模式中,我们可以看到确实如此。

那么,JPA如何确定我们用于保存地址实体属性值的列?

在这一点上,我认为您将能够轻松地猜测到这一点。 如果您不能,请继续关注我的下一篇文章!

直到下一次。

[完整的工作代码可以在github上找到。]

翻译自: https://www.javacodegeeks.com/2014/09/jpa-tutorial-mapping-entities-part-1.html

最后

以上就是甜美柚子最近收集整理的关于JPA教程:映射实体–第1部分的全部内容,更多相关JPA教程内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部