Возможно ли в Hibernate переопределить имя поля сущности в дочерней сущности? - PullRequest
0 голосов
/ 30 сентября 2019

Я пишу приложение, используя 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 заполняет фактические идентификаторы в среде выполнения для меня?

...