Лучшие практики с проектированием интерфейсов для репозитория JPA весной? - PullRequest
0 голосов
/ 18 сентября 2018

Мне было интересно, кто-нибудь может дать отзыв о паттерне, с которым я сейчас играю? Это предполагает наличие сущности, реализующей интерфейс DTO, который также используется (как проекция) в интерфейсе JpaRepository - для той же сущности - для возврата результатов запроса с конкретными столбцами. Интерфейс DTO также имеет методы по умолчанию, позволяющие любому экземпляру объекта и прокси-серверу DTO вести себя одинаково.

На вопросы, на которые я хочу ответить, есть ли у этого шаблона какие-либо недостатки, такие как производительность, которые могут помешать его использованию в работе. Мне также интересно услышать, как другие запрашивают определенные поля данных, используя JpaRepositories. Ниже приведен пример кода, который иллюстрирует шаблон, с которым я играю.

public interface InstructorDTO {
    String getFirstName();
    String getLastName();

    default String getFullName() {
        return getFirstName() + ' ' + getLastName();
    }
}

@Entity
public class Instructor implements InstructorDTO {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private int id;

    @Column(name="first_name")
    private String firstName;

    @Column(name="last_name")
    private String lastName;

    @Column(unique = true)
    private String email;

    @Override
    public String getFirstName() {
        return this.firstName;
    }

    @Override
    public String getLastName() {
        return this.lastName;
    }

    ...remaining getters and setters
}

@Repository
public interface InstructorRepository extends JpaRepository<Instructor, Integer> {

    <S> S findById(int id, Class<S> type);

    <T> Collection<T> findByEmail(String email, Class<T> type);
}


public class SomeClass {
    @Autowired
    InstructorRepository instructorRepository;

    public void someMethod {
        int id = 1;

        // Returns proxy
        InstructorDTO instructor1 = instructorRepository.findById(id, InstructorDTO.class);

        // Returns Instructor Object
        Instructor instructor2 = instructorRepository.findOne(id);

        System.out.println(instructor1.getFullName()); // returns John Doe
        System.out.println(instructor2.getFullName()); // returns John Doe
    }
}

1 Ответ

0 голосов
/ 18 сентября 2018

Нет недостатков с этим решением в отличие. Гораздо лучше использовать DTO вместо сущностей, если вам просто нужно несколько столбцов.

Потому что, если вы используете DTO только для SQL, будет создан оператор для выбора данных. Где, как если бы вы использовали Entities, могут быть загружены нетерпеливые или ленивые отношения, и это может вызвать проблему выбора n + 1.

Это сомнительно, только если вы действительно хотите, чтобы ваши организации продлили DTO. На мой взгляд, это не имеет смысла.

Две рекомендации.

...