场景:一个应用程序具有多个实体。每个实体表示一个数据库表。所有数据库表都具有主键列,但列名不同。
实体示例:
@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> {
}
服务等级示例:
@Component
public class ServiceMethodsImpl implements ServiceMethods {
@Autowired
private DaoRepos daoRepos ;
@Override
public void saveDatainDB(SaveData saveData ) {
daoRepos.save(saveData);
}
}
问题:如果我像下面这样声明dao接口:
@Repository
public interface ReviewRepos extends JpaRepository<SaveData,Long> {
}
像SaveData
在JPARepository中一样发送参数,那么我saveDatainDB
在服务类中的方法就可以正常工作了。
现在,这仅用于保存实体的数据。同样,存在其他实体,并且需要应用相同的保存功能。因此,我想到了创建一个将代表所有实体的通用类(在此示例中EntityClass
)。该类将作为参数发送给,JPARepository
因此在运行时,我们可以覆盖EntityClass
带有子类的对象(例如SaveData
)
但是Spring不允许创建EntityClass
没有@Id
列的Class 。因此,我必须声明一个ID列。同样在我的数据库中,每个表都有一个主列,但是所有表中该列的名称都不相同。例如,表XYZ将具有主列xyz_id表ABC将具有主列abc_id
因此,我必须在SaveData
带有@Column
注释的子类实体中定义一个ID列。
现在,当我尝试保存时,id
除了类id
中存在的列之外,还会创建一个单独的列SaveData
。这额外id
产生了错误unrecognized column
。
任何有关如何处理此问题的帮助将不胜感激。另外,请验证我的方法是否正确。
对于旧系统,可以使用@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;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句