Java 如何使泛型类对多个实体使用JPARepository
场景: 一个应用程序有多个实体。每个实体表示一个数据库表。所有数据库表都有主键列,但列名不同 实体示例:Java 如何使泛型类对多个实体使用JPARepository,java,spring-boot,jpa,spring-data-jpa,Java,Spring Boot,Jpa,Spring Data Jpa,场景: 一个应用程序有多个实体。每个实体表示一个数据库表。所有数据库表都有主键列,但列名不同 实体示例: @Entity @Table(name = "ABC",schema = "XYZ" ) public class SaveData extends EntityClass { @Id @Column(name = "ABC_ID", nullable = false, insertable = true, updatable = true, precision = 0)
@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类似于泛型类。此抽象类将由所有实体类扩展
@MappedSuperclass
public abstract class EntityClass {
@Id
private int id;
}
该应用程序具有Dao界面,如下所示:
@Repository
public interface DaoRepos extends JpaRepository<EntityClass,Long> {
}
问题:
如果我像下面那样声明dao接口:
@Repository
public interface ReviewRepos extends JpaRepository<SaveData,Long> {
}
@存储库
公共接口审查程序扩展了JpaRepository{
}
在JPARepository中将参数作为SaveData
发送,则服务类中的mysaveDatainDB
方法可以正常工作
现在,这仅用于保存实体的数据。同样,存在其他实体,需要应用相同的保存功能。因此,我考虑创建一个表示所有实体的泛型类(在本例中为EntityClass
)。该类将作为参数发送到JPARepository
,以便在运行时,我们可以用子类覆盖EntityClass
(例如SaveData
)
但是Spring不允许在没有@Id
列的情况下创建类EntityClass
。所以我必须声明一个ID列。同样在我的数据库中,每个表都有一个主列,但所有表中该列的名称都不同。
例如
表XYZ将有一个主列XYZ_id
表ABC将有一个主列ABC\U id
因此,我必须使用@column
注释在子类实体SaveData
中定义一个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;
}
现在,当我尝试保存时,会在SaveData
类中存在的id
列之外创建一个单独的id
列。这个额外的id
会产生错误,因为列无法识别
我们将感谢您对如何处理此问题的任何帮助。
另外,请验证我的方法是否正确。对于旧式系统,可以使用@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;
}