Pertanyaan DTO dan Entitas dalam satu objek?


Saya sedang dilema dan saya membaca banyak hal tentang ini.

Saya membuat DTO saya juga menjadi Entitas saya. Terlihat seperti ini:

@Entity
@PasswordMatches // custom validator
public class User {

    @Id
    @Column
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    @Column
    @NotNullOrEmpty // custom validator
    private String password;

    @Transient
    @NotNullOrEmpty // custom validator
    private String confirmPassword;

Q1: Apakah ini dapat diterima atau apakah ada cara yang lebih baik untuk melakukan ini? Karena saat ini, sebelum menyimpan User Saya hashing password untuk alasan yang jelas tetapi jika saya em.persist(user) secara langsung, itu akan gagal karena @PasswordMatches gagal. Itu hanya menghemat ketika saya melakukannya user.setConfirmPassword(hashedPassword) hanya untuk memuaskan validasi. Apakah saya melakukan hal yang benar di sini?


5
2017-07-01 15:02


asal


Jawaban:


Sementara EJB3 memungkinkan untuk kemungkinan Entitas digunakan sebagai DTO, kebenarannya adalah masih lebih baik untuk memiliki DTO terpisah.

Segera Anda akan menemukan bahwa Entitas Anda akan memerlukan anotasi terkait Penyedia JPA tertentu (seperti Hibernate) yang akan mengikat Entitas Anda ke lapisan persistensi. Ini berarti bahwa jika Entitas Anda diteruskan 'naik' ke lapisan presentasi Anda, maka lapisan itu perlu 'mengetahui' tentang pustaka / kerangka kerja spesifik yang Anda gunakan di lapisan persistensi Anda. Itu tidak banyak masalah jika Anda melakukan hal-hal web, tetapi jika Anda melakukan klien kaya (misalnya Swing) maka itu bisa menjadi bagasi ekstra yang harus dibawa oleh klien Anda.

Demikian pula, Anda akan ingin memulai annotating Entitas Anda untuk lapisan presentasi (misalnya menggunakan @Json anotasi). Menempatkan ini di entitas Anda akan kembali mengikat lapisan persistensi Anda ke lapisan presentasi Anda.

Awalnya kami jatuh ke dalam perangkap menggunakan Entitas kami untuk meneruskan data ke klien kaya kami, tetapi kami telah membuat lebih dari 300 kelas Entitas pada saat kami menyadari bahwa kami perlu memisahkan mereka ke dalam DTO dan Entitas Ketekunan. Itu adalah pengalaman yang menyakitkan untuk melakukan itu dengan begitu banyak Entitas, tetapi sekarang (dengan lebih dari 400 kelas Entitas) kami senang kami melakukannya.

Jadi, sementara itu aku s dapat diterima untuk melakukan apa yang Anda lakukan, Anda telah mengalami masalah di mana pencampuran logika bisnis dengan lapisan persistensi Anda telah menyebabkan masalah. Saya akan merekomendasikan Anda memisahkan ini ke dalam DTO dan Entitas untuk menyelamatkan Anda masalah lanjutan di masa depan.


10
2017-07-01 21:27



Jawabannya juga tergantung pada kasus penggunaan Anda. Pertimbangkan faktor-faktor ini

  1. Jika Anda mengantisipasi, mengekspos lapisan layanan Anda ke berbagai klien di masa depan. Dalam hal ini berbagi desain entitas Anda sebagai bagian dari tanda tangan metode layanan, tidak akan menjadi ide yang bagus, juga ini dapat menimbulkan masalah dalam desain yang dapat diperluas.
  2. Jika Anda mengembangkan aplikasi kecil / med, dengan kinerja sebagai prioritas utama di pikiran Anda, Anda dapat pergi hanya dengan entitas dari lapisan layanan (bahkan dari lapisan presentasi) ke lapisan ketekunan. Entitas dapat memiliki konfigurasi khusus persistensi yang didefinisikan dalam xml daripada melalui anotasi. Ini bukan desain yang buruk jika Anda memiliki pemetaan satu ke satu antara DTO dan entitas. Tentu saja dalam kasus ini, Anda akan memiliki pengembangan yang lebih cepat dan lebih sedikit bug.
  3. Jika Anda ingin menyimpan kacang terpisah untuk lapisan presentasi (bentuk biji), Anda juga dapat memikirkan campuran. Misalnya, untuk modul manajemen entitas utama - Gunakan entitas dan No DTO. Untuk modul manajemen entititas Transaksi- Gunakan entitas dan DTO.

5
2017-07-03 17:52



Dalam jangka pendek, tampaknya produktif dan membantu Anda menyelesaikan pekerjaan lebih cepat.

Dalam jangka panjang, itu selalu lebih baik untuk memiliki DTO dan Entitas yang terpisah.

Ketika hubungan antar entitas bertumbuh, Anda akan menyadari bahwa mengambil satu entitas akan menghasilkan entitas anak yang juga diambil, meskipun Anda mungkin tidak membutuhkannya dalam kasus penggunaan tertentu. DTO membantu Anda mengoptimalkan kueri basis data Anda dengan cara yang Anda perlukan menjaga entitas yang tersembunyi dari kasus penggunaan bisnis.


4
2017-07-04 05:32