Java JPA带额外字段的自参考一域映射
我有一个Java JPA带额外字段的自参考一域映射,java,spring-boot,spring-data-jpa,Java,Spring Boot,Spring Data Jpa,我有一个Phone和一个Phone4Phone\u Map表,第二个表设置了规则,以便当一部手机坏了时,可以换成另一部类似的手机 Phone: ------ idPhone INT(11) PK name VARCHAR() model VARCHAR() price LONG Phone4Phone_Map: ---------------- idPhone_in INT(11) PK idPhone_out INT(11) PK valid_since TIMESTAMP reason V
Phone
和一个Phone4Phone\u Map
表,第二个表设置了规则,以便当一部手机坏了时,可以换成另一部类似的手机
Phone:
------
idPhone INT(11) PK
name VARCHAR()
model VARCHAR()
price LONG
Phone4Phone_Map:
----------------
idPhone_in INT(11) PK
idPhone_out INT(11) PK
valid_since TIMESTAMP
reason VARCHAR()
我很难理解如何进行映射。我想知道
手机上的@OneToMany
自我参考是否可以,但我不知道如何包含Phone4Phone\u Map
中的额外字段(valid\u since
和reason
),这是我考虑不映射第二个表,我不知道这是否可能。如果电话有电话4phone\u映射的列表
你可以做以下事情
类Phone
将有许多Phone4Phone\u-Map
对象
class Phone{
private Integer idPhone;
private String name;
private String model;
private Long price;
@OneToMany(mappedBY="phone")
private List<Phone4Phone_Map> phone4Phone_Map;
//Getters/Setters
}
注意这两个类别都考虑了@实体
字段类型/名称只是示例,您可以更改它们。我避免了其他必要的注释(例如@Id
),以保持示例的简单性
有了这样的结构,你的桌子就会
Phone:
------
idPhone INT(11) PK
name VARCHAR()
model VARCHAR()
price LONG
及
如您所见,自引用的@OneToMany
不起作用,因为一部电话可以有许多替代品。如果删除附加字段,则可以使用@manytomy
;否则,您需要第二个实体。您需要一个@OneToMany到Phone4Phone\u映射。正如您所看到的,可能会有一部手机可以被多部手机替换的要求,例如,如果可用,可以将iPhone5替换为iPhone5或iPhone5S?考虑一下你对未来发展的要求。@SJuan76,我明白你的意思,但在我的例子中,我只想拥有一个可以替代它的手机集合(我不需要它可以替代的手机集合……如果这会给JPA带来某种问题,idk)。在这种情况下,额外的字段也是必需的。@karthik-r,所以您的想法是创建这两个实体,并仅将Phone4Phone\u映射与@OneToMany
关联?答案中提到的@Jonathan La'Fey看起来不错。如果您需要或不需要复合代码,您可以根据您的需求调整代码。你比我们更了解故事结构和问题。idPhone\u in
应该是带有电话的@OneToOne
,而idPhone\u out
可能不是needed@jonathan-拉菲,你的建议似乎符合我的需要,但我对我所想的idPhone\u in
和idPhone\u out
有疑问(在为Phone4Phone\u Map
创建实体的情况下)这将是一个复合PK。你是在暗示我在这种情况下应该忘记这一点吗?我看不太清楚。我认为OP需要很多替换品来替换一部手机。另外,我想保持他的表结构尽可能完整。idPhone\u out
可以或不可以作为你的Phone4Phone\u映射的主键的一部分。作为SJuan76 I尽管如此,它可能并不需要。这取决于您,我只是添加了它以尽可能保持您的表的稳定。编辑:如果您决定将idPhone\u保留在
之外,那么您的idPhone\u保留在
中应该是主键和外键
Phone:
------
idPhone INT(11) PK
name VARCHAR()
model VARCHAR()
price LONG
Phone4Phone_Map:
----------------
idPhone_in INT(11) PK
idPhone_out INT(11) PK
valid_since TIMESTAMP
reason VARCHAR()
idPhone_out FK references Phone(idPhone)