gpt4 book ai didi

java - 多对多接口(interface)和嵌入式

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:58:23 27 4
gpt4 key购买 nike

我想创建一个单向的@ManyToMany在 Account 实体和 Pushable 接口(interface)之间。 Pushable 只是一个标记接口(interface),由两个类实现:Package 和 Plan

包是一个简单的实体:

@Entity
public class Package extends BasicEntity{
}

但是 Plan 是放置在 Service 实体中的嵌入式对象:

@Entity
public class Service extends BasicEntity{

@Embedded
Plan plan;
}

BacicEntity 为其子项提供 ID:

@MappedSuperclass
public abstract class BasicEntity{

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "ID")
protected Long id;
}

enter image description here

我的映射看起来像这样:

@Entity
public class Account extends Basicentity{

@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name="PUSHABLES_ACCOUNTS", joinColumns=@JoinColumn(name="ID"),
inverseJoinColumns=@JoinColumn(name="ID"))
private List<Pushable>pushables = new ArrayList<Pushable>();
}

我主要担心的是:

  • 实体和接口(interface)之间的映射是否有效? (一般)
  • 在连接表中有两个 ID 列会不会有问题?Account 和 Service 都从 BasicEntity 获取@Id

最佳答案

would a mapping between an Entity and an Interface even work? (in general)

JPA 规范定义了实体之间的关系。 JPA 规范的 2.1 规定接口(interface)必须“不能被指定为实体”。所以 Pushable 不能以任何可移植的方式成为关系的目标。此外,您的 Plan 对象是一个嵌入式对象,本身不是实体,也不能成为关系的目标。

would it be a problem to have two ID columns in a join table? Both Account and Service get @Id from BasicEntity

不管接口(interface)是目标这一事实,您设置的@JoinTable 存在一个原则性问题。

@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name="PUSHABLES_ACCOUNTS", joinColumns=@JoinColumn(name="ID"),
inverseJoinColumns=@JoinColumn(name="ID"))

@JoinColumn(name="ID")中,'name'指的是链接表PUSHABLES_ACCOUNTS中的列名,对于inverseJoinColumns=@JoinColumn(name="ID"))因此,(忽略 Pushables 不是实体的事实),您的 joinColumns 和 inverseJoinColumns 引用 PUSHABLES_ACCOUNTS 链接表中的同一列。您需要将帐户的 ID 链接到 Pushable 的 ID。您希望连接表看起来像下面这样:

       PUSHABLES_ACCOUNTS
**Account_ID** **PUSHABLES_ID**
005 017
…. ….

因此您的连接表将是:

@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name="PUSHABLES_ACCOUNTS",
joinColumns=@JoinColumn(name=" Account_ID ", referencedColumnName=”ID”),
inverseJoinColumns=@JoinColumn(name=" PUSHABLES_ID " , referencedColumnName=”ID”))

我在此处添加了 referencedColumnName,尽管默认情况下会使用这些值。这些是源表 (joinColumns) 和目标表 (inverseJoinColumns) 的列。这种关系可能是自引用的,并且源表 = 目标表。


选项

因此,在您当前的类图中,来自 Account 的唯一可能的关系目标是 Package 和 Service。因此,您可以从 Account 定义两个 ManyToMany 关系——一个到 Package,一个到 Service。然后从每个服务实体中挖掘出嵌入式计划,并以此方式构建可推送列表。

根据您的业务需求,您可以使用相当多的灵 active ,并且当接口(interface)、可嵌入对象、映射父类(super class)等非实体看起来需要成为关系的一部分时,考虑将它们提升或管理到实体也可能有帮助。

例如,将 BasicEntity 更改为 MappedSuperclass 中的实体——尽管您需要定义继承策略——然后您可以在 Account 和 BasicEntity 之间建立关系。

另一个选项——我还没有尝试过——是定义和抽象实体类,它扩展了 BasicEntity 并且是包和服务的父类(super class)。然后该类可以成为帐户中多对多的方便目标,您需要再次考虑您的继承策略。.

关于java - 多对多接口(interface)和嵌入式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31583660/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com