为了账号安全,请及时绑定邮箱和手机立即绑定

如何使泛型类为多个实体使用 JPARepository

如何使泛型类为多个实体使用 JPARepository

MYYA 2022-07-27 20:12:10
场景: 一个应用程序有多个实体。每个实体表示一个数据库表。所有数据库表都有一个主键列,但列名不同。实体示例:@Entity@Table(name = "ABC",schema = "XYZ" )public class SaveData extends EntityClass {    @Id    @Column(name = "ABC_ID", nullable = false, insertable = true, updatable = true, precision = 0)    private int id;    @Column(name = "ABC1_ID", nullable = false, insertable = true, updatable = true, precision = 0)    private int abc1_id;    @Column(name = "DATA", nullable = true, insertable = true, updatable = true, precision = 0)    private String data;   //Getter - Setter methods of the above member variables.}EntityClass 就像一个泛型类。这个抽象类将被所有实体类扩展。@MappedSuperclasspublic abstract class EntityClass {    @Id    private int id;}该应用程序有一个 Dao 界面:@Repositorypublic interface DaoRepos extends JpaRepository<EntityClass,Long> {}服务类示例:@Componentpublic class ServiceMethodsImpl implements ServiceMethods {    @Autowired    private DaoRepos daoRepos ;    @Override    public void saveDatainDB(SaveData saveData ) {        daoRepos.save(saveData);    }}问题: 如果我像下面这样声明 dao 接口:@Repositorypublic interface ReviewRepos extends JpaRepository<SaveData,Long> {}SaveData像在 JPARepository 中一样发送参数,然后我saveDatainDB在服务类中的方法就可以正常工作。现在这仅用于保存实体的数据。同样,存在其他实体,需要应用相同的保存功能。所以我想创建一个代表所有实体的通用类(在这个例子中EntityClass)。该类将作为参数发送到,JPARepository以便在运行时,我们可以覆盖EntityClass带有子类(例如SaveData)但是 Spring 不允许创建EntityClass没有@Id列的类。所以我不得不声明一个 ID 列。同样在我的数据库中,每个表都有一个主列,但所有表的该列的名称都不同。例如,表 XYZ 将有一个主列 xyz_id 表 ABC 将有一个主列 abc_id所以我不得不在SaveData带有@Column注释的子类实体中定义一个 ID 列。现在,当我尝试保存时,除了类中存在id的列之外,还会创建一个单独的列。这个额外的创建错误为.idSaveDataidunrecognized column另外,我很想知道我的方法是否正确。
查看完整描述

1 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

对于遗留系统,可以使用 @AttributeOverride 注释覆盖 id 列名。


@Entity

@AttributeOverride(name="id", column=@Column(name="ABC_ID"))

@Table(name = "ABC",schema = "XYZ" )

public class SaveData extends EntityClass {


    @Column(name = "ABC1_ID", nullable = false, insertable = true, updatable = true, precision = 0)

    private int abc1_id;


    @Column(name = "DATA", nullable = true, insertable = true, updatable = true, precision = 0)

    private String data;    

}


查看完整回答
反对 回复 2022-07-27
  • 1 回答
  • 0 关注
  • 146 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信