介绍:
作为一个面向对象的开发人员,我们希望避免使用带有大量不相关字段的大型类。 因此,我们可能经常感到有必要使用多个对象来表示JPA实体。
在本快速教程中,我们将学习如何使用JPA或Hibernate中的@Embedded和@Embeddable注释来实现它。
上下文构建:
假设我们有一个人桌 具有以下列:
id|firstName|middleName|lastName|street|city|country|pincode
我们希望将其映射为JPA实体。
在我们的实体类中直接映射这么多属性对于我们开发人员的本能并不那么自然。 同样,更改数据库表结构也不可行。 我们做什么?
首先定义一个PersonName和Address类:
@Embeddable public class PersonName { private String firstName; private String middleName; private String lastName; //constructors, getters, setters ... } @Embeddable public class Address { private String street; private String city; private String country; private String pincode; //constructors, getters, setters ... }
我们已经使用@Embeddable批注标记了这两者,以表示它们将被嵌入到JPA实体中。
最后,我们将使用@Embedded注释嵌入特定类型。
让我们来定义将代表我们的人表我们的Person实体:
@Entity public class Person { @Id @GeneratedValue private Integer id; @Embedded private PersonName name; @Embedded private Address address; //constructor, getters, setters ... }
我们在这里使用@Embedded批注来表示这些对象将被嵌入到我们的实体中。 换句话说, 所有这些对象将一起映射到一个人数据库表。
覆盖属性:
当我们有多个实体使用可嵌入对象时,可嵌入对象通常特别方便。
现在让我们说,我们还有另一个表– office :
id|streetAddr|city|country|postcode|...
office表还具有一个Address类型,只是几个字段名称有所不同。
同样,在这里,我们可以使用相同的Address可嵌入对象。 这个想法是使用@AttributeOverrides和@AttributeOverride注解覆盖Address类的street和pincode属性 :
@Entity public class Office { @Id @GeneratedValue private Integer id; @Embedded @AttributeOverrides (value = { @AttributeOverride (name = "street" , column = @Column (name = "streetAddr" )), @AttributeOverride (name = "pincode" @AttributeOverride "pincode" , column = @Column , column = (name = "postcode" )) }) private Address address; ... }
这种方法更加简洁,使我们避免在多个实体之间重复使用名称重复的重复字段。
相反,我们可以覆盖可嵌入类型的任何列属性。
结论:
在本教程中,我们探讨了JPA @Emdeddable和@Embedded注解。
成为第一个发表评论的人。
翻译自: https://www.javacodegeeks.com/2020/01/jpa-embeddable-and-embedded.html