概述
在本文中,我将讨论JPA中的实体映射过程。 至于我的示例,我将使用与 我以前的一篇文章中使用的模式相同的模式 。
在前两篇文章中,我解释了如何在Java SE环境中设置JPA。 我不打算为Web应用程序编写安装过程,因为Web上的大多数教程都完全做到了这一点。 因此,让我们直接跳过对象关系映射或实体映射。
Wikipedia定义对象关系映射如下:
计算机科学中的对象关系映射(ORM,O / RM和O / R映射)是一种编程技术,用于在面向对象编程语言中的不兼容类型系统之间转换数据。 实际上,这会创建一个“虚拟对象数据库”,可以在编程语言中使用它。 尽管有些程序员选择创建自己的ORM工具,但有执行对象关系映射的免费和商业软件包。
通常,映射是您将有关数据库的必要信息提供给ORM工具的过程。 然后,该工具使用此信息将对象读/写到数据库中。 通常,您告诉您的ORM工具表名称,特定类型的对象将保存到该表名称。 您还提供了对象属性将映射到的列名。 还需要指定不同对象类型之间的关系。 所有这些似乎都是很多任务,但是幸运的是,JPA遵循所谓的“ Convention over Configuration”方法,这意味着如果您采用JPA提供的默认值,则只需配置很少的部分应用程序。
为了在JPA中正确映射类型,您至少需要执行以下操作:
- 用@Entity批注标记您的课程。 这些类称为实体。
- 用@Id注释标记类的属性/获取方法之一。
就是这样。 您的实体已准备好保存到数据库中,因为JPA会自动配置映射的所有其他方面。 这也显示了使用JPA可以享受的生产率提高。 您无需在每次查询数据库时手动填充对象,从而避免编写大量样板代码。
让我们来看一个例子。 考虑以下我根据以上两个规则映射的地址实体:
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文件中添加此实体声明,我在上一篇文章中已经对此进行了解释。
好吧,让我们保存一些对象! 以下代码段正是这样做的:
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。
经过上述修改,我的实体类变成了这样的东西:
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........
插入过程变为:
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如何确定用于保存地址实体的表? 事实证明,这很简单:
- 如果映射未提供任何明确的表信息,则JPA会尝试查找名称与实体名称匹配的表。
- 可以使用@Entity批注的“名称”属性显式指定实体的名称。 如果未找到名称属性,则JPA会假定实体的默认名称。
- 实体的默认名称是实体类的简单名称(非完全限定名称),在我们的情况下为Address。 因此,我们的实体名称随后被确定为“地址”。
- 由于我们的实体名称为“地址”,因此JPA会尝试查找数据库中是否存在名称为“地址”的表(请记住,大多数情况下数据库表名称均不区分大小写)。 从我们的模式中,我们可以看到确实如此。
那么,JPA如何确定我们用于保存地址实体属性值的列?
在这一点上,我认为您将能够轻松地猜测到这一点。 如果您不能,请继续关注我的下一篇文章!
直到下一次。
[完整的工作代码可以在github上找到。]
翻译自: https://www.javacodegeeks.com/2014/09/jpa-tutorial-mapping-entities-part-1.html
最后
以上就是甜美柚子为你收集整理的JPA教程:映射实体–第1部分的全部内容,希望文章能够帮你解决JPA教程:映射实体–第1部分所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复