spring根据条件动态注入@Entity Bean

Cmic_103 2023-05-24 16:16:22

问题:有一个业务需要和不同的第三方对接,第三方返回的数据不同。 无法完全整合为一张表。

现状:项目运行时,只会实现其中一个三方对接,要求数据库中该业务数据表只有1张表。设计想通过配置内容,按条件控制@entity注入,最终保持只有一个实体映射到表

疑问:如何介入spring自动注入@Entity,根据条件只有一个被注入

@Entity
@Table(name="t_result")
class AResult() {
    private Long id;
    private String msg;
}

@Entity
@Table(name="t_result")
class BResult() {
    private Long id;
    private String count;
}

@Entity
@Table(name="t_result")
class CResult() {
    private Long id;
    private String other;
}

 

 

 

...全文
255 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Cmic_103 2023-06-05
  • 打赏
  • 举报
回复

问题已解决,通过实现org.hibernate.boot.model.naming.PhysicalNamingStrategy,通过规则匹配需注入的实体,变更实体名,标识出忽略的实体,再通过实现org.hibernate.tool.schema.spi.SchemaFilter 将标识忽略的实体移除。

今天没空哦 2023-05-30
  • 打赏
  • 举报
回复

这三个实体类对应同一张数据库表t_result,可以通过@MappedSuperclass注解和继承来重用实体类的属性。
1、创建一个父类Result,并使用@MappedSuperclass注解标注。

@MappedSuperclass
public abstract class Result {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    protected Long id;
    
    // 其他共用属性
}

2、分别创建三个子类AResult、BResult和CResult,并继承Result类。

@Entity
@Table(name="t_result")
public class AResult extends Result {
    private String msg;
    
    // AResult独有属性
}

@Entity
@Table(name="t_result")
public class BResult extends Result {
    private String count;
    
    // BResult独有属性
}

@Entity
@Table(name="t_result")
public class CResult extends Result {
    private String other;
    
    // CResult独有属性
}

这样就可以将三个实体类中共用的属性抽象出来,并通过继承来复用。这种方式可以减少代码量,避免代码冗余,同时也方便后续对实体类的修改和维护。

Cmic_103 2023-06-05
  • 举报
回复
@今天没空哦 目的是控制运行时只有一个实体被注入,这样只是抽离的公共属性。

39

社区成员

发帖
与我相关
我的任务
社区描述
Spring相关技术分享讨论
社区管理员
  • 七号公园的忧伤
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧