gpt4 book ai didi

java - 如何创建通用类以将 JPARepository 用于多个实体

转载 作者:行者123 更新时间:2023-11-30 05:44:20 29 4
gpt4 key购买 nike

场景:一个应用程序有多个实体。每个实体表示一个数据库表。所有数据库表都有主键列,但列名不同。

实体示例:

@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 接口(interface):

@Repository
public interface DaoRepos extends JpaRepository<EntityClass,Long> {

}

服务类别示例:

@Component
public class ServiceMethodsImpl implements ServiceMethods {

@Autowired
private DaoRepos daoRepos ;

@Override
public void saveDatainDB(SaveData saveData ) {
daoRepos.save(saveData);
}

}

问题:如果我像下面这样声明 dao 接口(interface):

@Repository
public interface ReviewRepos extends JpaRepository<SaveData,Long> {

}

在 JPARepository 中将参数作为 SaveData 发送,然后我的服务类中的 saveDatainDB 方法就可以正常工作。

现在这仅用于保存实体的数据。同样,存在其他实体并且需要应用相同的保存功能。因此,我想到创建一个通用类来表示所有实体(在本例中 EntityClass)。该类将作为参数发送到JPARepository,以便在运行时,我们可以使用子类覆盖EntityClass(例如SaveData)

但是Spring不允许创建没有@Id列的类EntityClass。所以我必须声明一个 ID 列。同样在我的数据库中,每个表都有一个主列,但所有表的该列的名称都不同。例如,表 XYZ 将具有主列 xyz_id表 ABC 将有一个主列 abc_id

因此,我必须使用 @Column 注释在子类实体 SaveData 中定义一个 ID 列。

现在,当我尝试保存时,除了 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;
}

关于java - 如何创建通用类以将 JPARepository 用于多个实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55105103/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com