Я пишу приложение, используя Spring Boot, Hiberane и Spring Data.
У меня есть две таблицы в db: tableA и tableB . У них есть некоторые общие поля, но их идентификаторы, имена разные, также я создал базовую модель для них, чтобы они содержали некоторые общие поля, прямо сейчас это выглядит примерно так:
// BaseModel
@MappedSuperclass
public abstract class BaseModel implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name="common_field_1")
private String commonField1;
@Column(name="common_field_2")
private String commonField2;
@Column(name="common_field_3")
private String commonField3;
}
// ExactModel 1
@Entity
@Table(name="table1" ,schema="schema")
public class ExactModel1 extends BaseModel {
@Id
@Basic(fetch=FetchType.EAGER)
@Column(name="exact_model_id_1", nullable=false)
private long exactModel1Id;
private String exactField1;
}
// ExactModel 2
@Entity
@Table(name="table2" ,schema="schema")
public class ExactModel2 extends BaseModel {
@Id
@Basic(fetch=FetchType.EAGER)
@Column(name="exact_model_id_2", nullable=false)
private long exactModel2Id;
private String exactField2;
}
И у меня есть некоторая общая логика, которая реализует некоторую общую логику crud, которая работает для классов, которые расширяют BaseModel :
public abstract class BaseServiceImpl<M extends BaseModel, R extends BaseRepository<M>> implements BaseService<M, Long> {
private final R repository;
public BaseServiceImpl(R repository) {
this.repository = repository;
}
@Override
public M save(M model) {
return repository.save(model);
}
@Override
public List<M> saveAll(List<M> models) {
return repository.saveAll(models);
}
@Override
public M findById(Long id) {
return repository.getOne(id);
}
@Override
public List<M> findAllById(List<Long> ids) {
return repository.findAllById(ids);
}
@Override
public List<M> findAll() {
return repository.findAll();
}
@Override
public M update(M model) {
return repository.save(model);
}
@Override
public List<M> updateAll(List<M> models) {
return repository.saveAll(models);
}
@Override
public void delete(M model) {
repository.delete(model);
}
@Override
public void delteById(Long id) {
repository.deleteById(id);
}
@Override
public void deleteInBatch(List<M> models) {
repository.deleteInBatch(models);
}
@Override
public Long countModels() {
return repository.count();
}
}
Теперь мне нужнокаким-то образом получить идентификатор сущности, с которой я работаю, в этой общей логике, но в BaseModel нет поля идентификатора, поэтому я не могу просто использовать baseModel.getId()
.
Вопрос :Можно ли определить поле идентификатора mock в BaseModel и переопределить его в дочерних классах, чтобы я мог использовать этот идентификатор в универсальных методах, но Hibernate заполняет фактические идентификаторы в среде выполнения для меня?