我正在探索能够为多个实体存储特定地址(家庭、工作等)的选项,以及拥有一个包含所有地址的表,可能每个记录都有某种鉴别器。所有表的主键都是uuid。
我使用的是springboot2.3.6和jpa/hibernate。
理想情况下,我希望使用每个实体的命名属性,而不是持有实体的集合,因为这将使dtoMap和更新更容易。
如果共享地址表中的条目中没有输入数据,则每个实体和属性对的值都为空,这对我来说不是问题。
在伪代码中,我希望能够将实体定义为:
@Entity
class Person {
private Address homeAddress;
private Address workAddress;
}
@Entity
class Incident {
private Address incidentLocation;
}
@Entity
class Address {
private String street;
private String zip;
}
我研究过使用jpa选项,比如 @Embeddable
我看到的选项是a)每个实体有一个可嵌入的(我想要多个)b)使用 @CollectionTable
(我需要特定的命名属性)或c)使用 @AttributeOverride
这意味着表中每个属性的重复列和重命名列。
我也看过 @JoinTable
以及 @OneToMany
但这也是为了使用集合。
我觉得 @Embeddable
是我所需要的,但是需要能够为使用此类型的每个属性(homeaddress、workaddress、incidentlocation)指定一个鉴别器,以便address表中的数据遵循以下格式
id type street zip
=========================================
UUID-1 HOME 1 Main St 30002
UUID-1 WORK 10 North St 30005
UUID-2 INCIDENT 5 West Ave 30008
作为奖励,我还希望(如果可以的话)能够创建一个 JpaRepository<Address>
它允许我独立于父实体查询/更新地址。
有了所有的选择,我想知道是否有人知道是否有一种方法可以实现我想要的,或者我必须走收集路线才能实现这一点?谢谢
3条答案
按热度按时间lhcgjxsq1#
如果地址与多个元素有关,最好的解决方法是使用一个从任何元素到多个元素的直接关系
Address
,如下所示:如果同一地址被多次使用,也可以使用@manytoone。例如
homeAddress
以及workAddress
是相同的,并且您不希望有可为null的字段。在这种情况下,实体
Address
不知道属于哪个实体,但关系的第二方(Person
或者Incident
)知道哪个地址是自己的。在表格中Person
以及Incident
将是地址id为的列3hvapo4f2#
只是有一堆财产(
homeAddress
,workAddress
…)每个引用一个Address
作为一对一的关系,在setter中设置鉴别器。r8uurelv3#
多亏了我的帮助,我认为crizzis和最近jens的建议结合起来使我实现了jpa。
以防任何人也需要它
这将在mysql数据库中生成以下ddl