Я пытаюсь реорганизовать DAO, чтобы сделать его немного более удобным в нашей базе кода.В настоящее время у нас есть параметризованный AbstractDao, который принимает три типа:
- Таблица базы данных
- База данных pojo
- Другое сопоставленное представление pojo 2)
Таким образом, в конечном итоге это выглядит так:
public class AbstractDao<T extends DatabaseTable, R extends DatabaseRecord, M> {
public AbstractDao(Connection connection, Mapper<R,M> mapper) {
//save connection and mapper to protected variables
}
public List<M> insert(List<M> records) {
connection.insertBulk(
StreamEx.of(records).map(mapper::map).toList()
);
}
}
Однако это не работает в классическом случае DAO, когда мы имеем дело только с pojo и столом.
Однако здесь есть общая функциональность, которую можно абстрагировать в более базовый AbstractDao, который полезен для всех проектов.Что-то вроде:
AbstractDao<T extends DatabaseTable, R extends Record>
, у которого есть подкласс
AbstractMappedDao<T extends DatabaseTable, R extends Record, M> extends AbstractDao<T, R>
Аннотация имеет метод, подобный:
public List<R> insert(List<R> records) {
connection.insertBulk(records);
}
, и Mapped должен иметь метод, подобный:
public List<M> insert(List<M> records) {
super.insert(StreamEx.of(records).map(mapper::map).toList());
}
Тем не менее, это приводит к проблеме "того же стирания", потому что вставка получает в списке универсальных элементов.
Я попытался абстрагировать его в интерфейс:
public interface Dao<T> {
public List<T> insert(List<T> records);
}
И заставить Abstract реализовать Dao, а Mapped - Dao, но, опять же, та же проблема.
Итак, мой вопрос, как лучше всего подойти к этой проблеме?Это работает, как и ожидалось, если я изменю подпись карты на что-то вроде:
insertMapped(List<M> mapped);
Но я бы предпочел оставить контракт таким же.
Спасибо за помощь.С нетерпением жду обсуждения!