如果相同的表但不同的模式,如何避免重复 jpa 映射(实体、服务、存储库..)?

Posted

技术标签:

【中文标题】如果相同的表但不同的模式,如何避免重复 jpa 映射(实体、服务、存储库..)?【英文标题】:How to avoid to duplicate a jpa mapping (entity, service, repository..) if same table but different schemas? 【发布时间】:2021-06-08 05:38:15 【问题描述】:

我正在使用 jpa 并且有 2 个实体,但在这种情况下:

实体 A = schemaA.tableX 实体 B = schemaB.tableX

tableX 相同,但在 2 个不同的架构(A 和 B)上重复,内部相同的列,我应该通过我的应用程序用相同的数据填充它们。

问题是:是否有可能在我的代码中,映射一次这个 tableX 并且以某种方式,数据将被拆分为两个,每个模式一个??

我不想:

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "TableX", schema = "A")
public class A implements Serializable 
  @Id
  @Column(name = "id")
  private String id; <=== on table A
 

还有:

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "TableX", schema = "B")
public class B implements Serializable 
  @Id
  @Column(name = "id")
  private String id; <=== on table B
 

实体、存储库、服务、实现的愚蠢副本/过去...因为完全相同的表!

【问题讨论】:

【参考方案1】:

你可以通过@MappedSuperClass 做到这一点:

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@MappedSuperClass // <-- see this annotation
public class AbstractTable implements Serializable  // <-- name the class however you want
    @Id
    @Column(name = "id")
    private String id;

然后将其他两个类更改为:

@Entity
@Table(name = "TableX", schema = "A")
public class A extends AbstractTable 

@Entity
@Table(name = "TableX", schema = "B")
public class B extends AbstractTable 

【讨论】:

以上是关于如果相同的表但不同的模式,如何避免重复 jpa 映射(实体、服务、存储库..)?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 hibernate/jpa 注释将一个类映射到不同的表

如何将来自不同表但相同数据库mysqli php的2列相乘[关闭]

如何从不同的表中获取 customer_id 并在 laravel 中使用正确的方法避免重复?

JPA,如何使用同一个类(实体)来映射不同的表?

不要重复自己:相同的 SQL 查询,但有两个不同的表

Spring JPA:如何在同一个请求中更新 2 个不同的“DataSource”中的 2 个不同的表?