Я использую аннотации для методов получения / установки, потому что у меня есть API, отделенный от реализации, и я хотел оставить часть API полностью свободной от фреймворка, позволяя мне переключать каркасы или предоставлять различные реализации.Например, сейчас я использую spring-data-jpa, но с помощью API ниже я могу легко переключиться на spring-jdbc или любую другую платформу.
Что я сделал, так это определил интерфейсы для контроллера,хранилище и сущность, как таковая:
public interface MyEntityController<T extends MyEntity> {
Iterable<T> listEntities();
T getEntity(Long id);
}
public interface MyEntityService<T extends MyEntity> {
Iterable<T> findAll();
T findById(Long id);
}
public interface MyEntityRepository<T extends MyEntity> {
Iterable<T> findAll();
T findOne(Long id);
}
// no JPA annotations here
public abstract class MyEntity {
protected Long id;
protected String myField;
}
Далее я просто реализую MyEntity следующим образом и использую MyEntityImpl для реализаций контроллера, службы и хранилища:
@Entity
public class MyEntityImpl extends MyEntity {
@Id public long getId() { return id; }
@Column public String getMyField() { return myField };
// setters, etc
}
@Repository
public interface MyEntityRepositoryImpl extends MyEntityRepository, JPARepository<MyEntityImpl, Long> {
}
У меня естьуже проверил и работает нормально.Простое аннотирование MyEntityImpl
с помощью @Entity
не сработало бы, поскольку суперкласс должен был бы быть @MappedSuperclass
.