Saat ini saya memiliki aplikasi Spring Boot menggunakan Spring Data REST. Saya memiliki entitas domain Post
yang memiliki @OneToMany
hubungan dengan entitas domain lain Comment
,. Kelas-kelas ini disusun sebagai berikut:
Post.java:
@Entity
public class Post {
@Id
@GeneratedValue
private long id;
private String author;
private String content;
private String title;
@OneToMany
private List<Comment> comments;
// Standard getters and setters...
}
Comment.java:
@Entity
public class Comment {
@Id
@GeneratedValue
private long id;
private String author;
private String content;
@ManyToOne
private Post post;
// Standard getters and setters...
}
Repositori JPA Spring Data REST mereka adalah implementasi dasar dari CrudRepository
:
PostRepository.java:
public interface PostRepository extends CrudRepository<Post, Long> { }
CommentRepository.java:
public interface CommentRepository extends CrudRepository<Comment, Long> { }
Titik masuk aplikasi adalah aplikasi Spring Boot standar dan sederhana. Semuanya sudah dikonfigurasi stok.
Application.java
@Configuration
@EnableJpaRepositories
@Import(RepositoryRestMvcConfiguration.class)
@EnableAutoConfiguration
public class Application {
public static void main(final String[] args) {
SpringApplication.run(Application.class, args);
}
}
Semuanya tampak bekerja dengan benar. Ketika saya menjalankan aplikasi, semuanya tampak bekerja dengan benar. Saya dapat POST objek Post baru untuk http://localhost:8080/posts
menyukainya:
Tubuh:
{"author":"testAuthor", "title":"test", "content":"hello world"}
Hasil di http://localhost:8080/posts/1
:
{
"author": "testAuthor",
"content": "hello world",
"title": "test",
"_links": {
"self": {
"href": "http://localhost:8080/posts/1"
},
"comments": {
"href": "http://localhost:8080/posts/1/comments"
}
}
}
Namun, ketika saya melakukan GET di http://localhost:8080/posts/1/comments
saya mendapatkan objek kosong {}
dikembalikan, dan jika saya mencoba untuk mengirim komentar ke URI yang sama, saya mendapatkan Metode HTTP 405 Tidak Diizinkan.
Apa cara yang benar untuk membuat Comment
sumber daya dan mengaitkannya dengan ini Post
? Saya ingin menghindari POST langsung ke http://localhost:8080/comments
jika memungkinkan.
Jawaban:
Anda harus memposting komentar terlebih dahulu dan saat memposting komentar Anda dapat membuat entitas posting asosiasi.
Ini akan terlihat seperti di bawah ini:
dan itu akan bekerja dengan baik.
sumber
author.post
dapat ditulisi (misalnya dengan memiliki penyetel atau@JsonValue
penjelasan)Dengan asumsi Anda telah menemukan URI posting dan dengan demikian URI sumber daya asosiasi (dianggap sebagai
$association_uri
berikut), biasanya dibutuhkan langkah-langkah berikut:Temukan sumber daya koleksi yang mengelola komentar:
Ikuti
comments
tautan danPOST
data Anda ke sumber daya:Tetapkan komentar ke postingan dengan mengeluarkan a
PUT
ke URI pengaitan.Perhatikan, bahwa pada langkah terakhir, sesuai spesifikasi
text/uri-list
, Anda dapat mengirimkan beberapa URI yang mengidentifikasi komentar yang dipisahkan oleh jeda baris untuk menetapkan beberapa komentar sekaligus.Beberapa catatan lagi tentang keputusan desain umum. Contoh posting / komentar biasanya merupakan contoh yang bagus untuk agregat, yang berarti saya akan menghindari referensi balik dari
Comment
kePost
dan juga menghindariCommentRepository
sepenuhnya. Jika komentar tidak memiliki siklus prosesnya sendiri (yang biasanya tidak ada dalam hubungan gaya komposisi) Anda lebih suka membuat komentar tersebut dirender secara langsung dan seluruh proses penambahan dan penghapusan komentar dapat ditangani dengan menggunakan JSON Patch . Spring Data REST telah menambahkan dukungan untuk itu di kandidat rilis terbaru untuk versi 2.2 mendatang.sumber
@JoinColumn(nullable=false)
)? Tidak mungkin untuk POST anak pertama, kemudian PUT / PATCH asosiasi induk.Ada 2 jenis Asosiasi dan Komposisi pemetaan. Dalam kasus asosiasi kami menggunakan konsep tabel gabung seperti
Karyawan - 1 sampai n-> Departemen
Jadi 3 tabel akan dibuat dalam kasus Asosiasi Karyawan, Departemen, Departemen_Departemen
Anda hanya perlu membuat EmployeeRepository dalam kode Anda. Selain itu pemetaan harus seperti itu:
Entitas Depatment tidak akan berisi pemetaan apa pun untuk kunci forign ... jadi sekarang ketika Anda akan mencoba permintaan POST untuk menambahkan Karyawan dengan Departemen dalam permintaan json tunggal maka itu akan ditambahkan ....
sumber
Saya menghadapi skenario yang sama dan saya harus menghapus kelas repositori untuk sub entitas karena saya telah menggunakan satu ke banyak pemetaan dan menarik data melalui entitas utama itu sendiri. Sekarang saya mendapatkan seluruh respons dengan data.
sumber
Untuk pemetaan oneToMany, cukup buat POJO untuk kelas yang ingin Anda Peta, dan anotasi @OneToMany padanya, dan secara internal akan memetakannya ke ID Tabel tersebut.
Selain itu, Anda perlu mengimplementasikan antarmuka Serializable ke kelas tempat Anda mengambil Data.
sumber