Actualmente tengo una aplicación Spring Boot que usa Spring Data REST. Tengo una entidad del dominio Postque tiene la @OneToManyrelación de dominio a otra entidad, Comment. Estas clases están estructuradas de la siguiente manera:
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...
}Comentario.java:
@Entity
public class Comment {
    @Id
    @GeneratedValue
    private long id;
    private String author;
    private String content;
    @ManyToOne
    private Post post;
    // Standard getters and setters...
}Sus repositorios Spring Data REST JPA son implementaciones básicas de CrudRepository:
PostRepository.java:
public interface PostRepository extends CrudRepository<Post, Long> { }CommentRepository.java:
public interface CommentRepository extends CrudRepository<Comment, Long> { }El punto de entrada de la aplicación es una aplicación Spring Boot estándar y simple. Todo está configurado stock.
Application.java
@Configuration
@EnableJpaRepositories
@Import(RepositoryRestMvcConfiguration.class)
@EnableAutoConfiguration
public class Application {
    public static void main(final String[] args) {
        SpringApplication.run(Application.class, args);
    }
}Todo parece funcionar correctamente. Cuando ejecuto la aplicación, todo parece funcionar correctamente. Puedo PUBLICAR un nuevo objeto de publicación para que me http://localhost:8080/postsguste:
Cuerpo: 
{"author":"testAuthor", "title":"test", "content":"hello world"}
Resultado en 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"
        }
    }
}Sin embargo, cuando realizo un GET en http://localhost:8080/posts/1/comments, obtengo un objeto vacío {}devuelto, y si intento PUBLICAR un comentario en el mismo URI, obtengo un Método HTTP 405 No permitido.
¿Cuál es la forma correcta de crear un Commentrecurso y asociarlo a este Post? Me gustaría evitar PUBLICAR directamente a http://localhost:8080/commentssi es posible.

Respuestas:
Primero debe publicar el comentario y, mientras publica el comentario, puede crear una entidad de publicaciones de asociación.
Debería verse como a continuación:
y funcionará perfectamente bien.
fuente
author.postse pueda escribir (por ejemplo, con un establecedor o una@JsonValueanotación)Suponiendo que ya ha descubierto el URI de la publicación y, por lo tanto, el URI del recurso de asociación (que se considera
$association_urien el siguiente), generalmente se siguen estos pasos:Descubra el recurso de colección gestionando comentarios:
Siga el
commentsenlace yPOSTsus datos hasta el recurso:Asigne el comentario a la publicación emitiendo un
PUTal URI de la asociación.Tenga en cuenta que en el último paso, de acuerdo con la especificación de
text/uri-list, puede enviar varios URI que identifiquen comentarios separados por un salto de línea para asignar varios comentarios a la vez.Algunas notas más sobre las decisiones generales de diseño. Un ejemplo de publicación / comentario suele ser un gran ejemplo para un agregado, lo que significa que evitaría la referencia inversa de la
Commenta laPosty también evitaría laCommentRepositorycompletamente. Si los comentarios no tienen un ciclo de vida por sí mismos (lo que generalmente no tienen en una relación de estilo de composición), prefiere que los comentarios se procesen en línea directamente y todo el proceso de agregar y eliminar comentarios se puede manejar usando Parche JSON . Spring Data REST ha agregado soporte para eso en el último candidato de lanzamiento para la próxima versión 2.2.fuente
@JoinColumn(nullable=false))? No sería posible POSTAR primero al hijo y luego PONER / PATCHAR la asociación principal.Hay 2 tipos de asociación y composición cartográfica. En caso de asociación, usamos el concepto de tabla de unión como
Empleado - 1 a n-> Departamento
Por lo tanto, se crearán 3 tablas en el caso de Asociación Empleado, Departamento, Empleado_Departamento
Solo necesita crear el EmployeeRepository en su código. Aparte de ese mapeo debería ser así:
La entidad del departamento no contendrá ningún mapeo para la clave forign ... así que ahora, cuando intente la solicitud POST para agregar Empleado con Departamento en una sola solicitud json, se agregará ...
fuente
Enfrenté el mismo escenario y tuve que eliminar la clase de repositorio para la entidad secundaria, ya que he usado una asignación de uno a muchos y extrajo datos a través de la entidad principal. Ahora obtengo la respuesta completa con datos.
fuente
Para el mapeo oneToMany, simplemente haga un POJO para esa clase que desea mapear, y una anotación @OneToMany, e internamente lo mapeará a ese ID de tabla.
Además, debe implementar la interfaz serializable a la clase que está recuperando los datos.
fuente