【问题标题】:JPA self-reference OneToMany mapping with extra fields带有额外字段的 JPA 自引用 OneToMany 映射
【发布时间】:2015-08-14 08:49:43
【问题描述】:

我有一个Phone 和一个Phone4Phone_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()

我很难理解如何进行映射。我想知道Phone 上的@OneToMany 自我引用是否会很好,但我不知道如何包含来自Phone4Phone_Map 的额外字段(valid_sincereason),这是我的想法不映射第二个表,我什至不知道它是否可能。

【问题讨论】:

  • 如您所见,自我引用的@OneToMany 不起作用,因为一部电话可以有许多替代品/可以替代很多。如果您删除其他字段,您可以使用@ManyToMany;否则你需要第二个实体。
  • 您需要一个@OneToMany 到Phone4Phone_Map。如您所见,可能有要求可以将一部手机更换为多部手机,例如iPhone5可以更换为iPhone5或iPhone5S,在可用性可能是?想想你对未来发展的要求。
  • @SJuan76,我明白你的意思,但就我而言,我只想拥有可以替代的手机集合(我不需要可以替换的手机集合。 .. idk 如果这会给 JPA 带来某种问题)。在这种情况下,额外的字段也是必需的。
  • @karthik-r,所以您的想法是创建两个实体,并仅将 Phone4Phone_Map 与 @OneToMany 关联映射?
  • @Jonathan La'Fey 提到的任何答案看起来都很好。如果您需要它作为复合代码,您可以根据您的要求调整您的代码。你比我们更了解故事结构和问题。

标签: java spring-boot jpa


【解决方案1】:

如果PhonePhone4Phone_Map的列表

您可以执行以下操作

Phone 类将有许多 Phone4Phone_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
}

并且Phone4Phone_Map 类的每个实例都会引用电话

如果Phone4Phone_Map 中的foreign_keyidPhone_out(损坏的手机),则映射为:

class Phone4Phone_Map{

    private Integer idPhone_in
    private Integer idPhone_out
    private Date valid_since
    private String reason

    @ManyToOne
    @JoinColumn(name="idPhone_out")
    private Phone phone;

    //Getters/Setters
}

注意这两个类都认为@Entity

字段类型/名称只是示例,您可以更改它们。我避免使用其他必要的注释(例如@Id)以保持示例简单。

使用这种结构,您的表格将是

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)

【讨论】:

  • idPhone_in 应该是带电话的@OneToOne,而idPhone_out 可能不需要
  • @jonathan-lafey,您的提议似乎符合我的需要,但我对 idPhone_inidPhone_out 有疑问(如果为 Phone4Phone_Map 创建实体)它将是一个复合PK。你是在暗示我应该在这种情况下忘记这一点吗?我没看清楚
  • 我认为 OP 想要为 1 部手机更换很多次。另外,我想让他的表结构尽可能完整。
  • idPhone_out 可以或不能是您的Phone4Phone_Map 的主键的一部分。正如SJuan76 指示的那样,它可能不需要。这取决于您,我只是添加它以尽可能保持您的表格完好无损。 编辑:如果您决定不使用idPhone_out,那么您的idPhone_in 应该是primary_keyforeign_key
猜你喜欢
  • 2014-11-19
  • 1970-01-01
  • 2011-12-05
  • 1970-01-01
  • 2022-07-14
  • 1970-01-01
  • 2013-02-15
  • 2011-07-25
  • 2019-02-24
相关资源
最近更新 更多