39
社区成员




问题:有一个业务需要和不同的第三方对接,第三方返回的数据不同。 无法完全整合为一张表。
现状:项目运行时,只会实现其中一个三方对接,要求数据库中该业务数据表只有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;
}
问题已解决,通过实现org.hibernate.boot.model.naming.PhysicalNamingStrategy,通过规则匹配需注入的实体,变更实体名,标识出忽略的实体,再通过实现org.hibernate.tool.schema.spi.SchemaFilter 将标识忽略的实体移除。
这三个实体类对应同一张数据库表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独有属性
}
这样就可以将三个实体类中共用的属性抽象出来,并通过继承来复用。这种方式可以减少代码量,避免代码冗余,同时也方便后续对实体类的修改和维护。