Лучшие практики с проектированием интерфейсов для репозитория JPA весной?

Мне было интересно, кто-нибудь может дать отзыв о модели, с которой я сейчас играю? Это предполагает наличие сущности, реализующей интерфейс 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 ответ

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

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

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

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

Другие вопросы по тегам