Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA带额外字段的自参考一域映射_Java_Spring Boot_Spring Data Jpa - Fatal编程技术网

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)