1

假设我有 3 个实体:MonitorPeriodMonitorFile

现在要求说对于每个MonitorPeriod,哪个表如下所示:

ID, DATE_FROM, DATE_TO
1     <value>  <value>

我有一个而且只有一个Monitor,该表可能如下所示:

ID, COMPILED,  ID_PERIOD, ID_FILE
1   true/false    1            1

现在,每个File,哪个表可能如下所示:

ID, NAME,    DESCRIPTION
1   <value>  <value>

可以有 N Monitor但每个MonitorPeriod只有一个。

有没有办法通过 JPA 模型实现这一目标?实体模型甚至应该创建阻止我在监视器表中插入两个具有相同MonitorPeriod ID 和相同文件ID 的 tupla 的约束。

- - - - - - - - - - - -更新 - - - - - - - - - -

是的,克里斯,你是完全正确的!我对我的功能分析师说过的话是一样的。

目标是在Monitor表中设计这三个实体关系:

ID, NAME, DESCRIPTION, ID_PERIOD, ID_FILE

我将有一个允许我插入的约束,例如:

ID, NAME, DESCRIPTION, ID_PERIOD, ID_FILE
1   null       null       1           1        // ok
2   null       null       2           1        // ok
3   null       null       1           2        // ok
4   null       null       2           2        // should throw error because file 2 is already linked with monitor period 1

我尝试重复这个逻辑:一个MonitorPeriod(从 1 月到 3 月的示例)可以只有一个Monitor(假设该监视器包含文件的详细信息,例如大小和扩展名,就是这样)。这是一个@OneToOne关系。现在的问题是一个文件可以有更多的监视器,但一个周期,如果一个与监视器有关系的连接文件我无法实现上述情况。@OneToMany

也许我应该以不同的方式连接实体或插入另一个表,我会尝试让你知道。同时,如果有人可以建议我一些,我将不胜感激!

4

1 回答 1

0

我设法做到了这一点,而没有添加无用的表或扭曲 ER 逻辑。

正如我所说,我有一个MonitorPeriod

@Entity
@Table(name = "monitor_period")
@Data
public class MonitorPeriod {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Integer id;

  private LocalDate dateFrom;
  private LocalDate dateTo;

  @OneToMany(mappedBy = "monitorPeriod")
  private List<Monitor> monitor;
}

现在我有我的文件

@Entity
@Table(name = "file")
@Data
public class File {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Integer id;

  @OneToMany(mappedBy = "file")
  private List<Monitor> monitor;
}

如前所述,文件(在他的生活中)可以有更多监视器,但每个MonitorPeriod只有一个

所以监视器表:

@Entity
@Table(name = "monitor", uniqueConstraints = { 
    @UniqueConstraint(name = "UniquePeriodoAndMonitor", columnNames = { "id_period", "id_file" }) 
    }
)
@Data
public class Monitor {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Integer id;

  private Boolean compilato;

  @ManyToOne(optional = false, fetch = FetchType.LAZY)
  @JoinColumn(name = "id_period")
  private MonitorPeriod monitorPeriod;

  @ManyToOne(optional = false, fetch = FetchType.LAZY)
  @JoinColumn(name = "id_file")
  private File file;
}

希望有帮助..

于 2022-01-25T18:31:02.210 回答