Actualmente tengo una aplicación Spring Boot que usa Spring Data REST. Tengo una entidad del dominio Post
que tiene la @OneToMany
relació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/posts
guste:
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 Comment
recurso y asociarlo a este Post
? Me gustaría evitar PUBLICAR directamente a http://localhost:8080/comments
si 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.post
se pueda escribir (por ejemplo, con un establecedor o una@JsonValue
anotació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_uri
en el siguiente), generalmente se siguen estos pasos:Descubra el recurso de colección gestionando comentarios:
Siga el
comments
enlace yPOST
sus datos hasta el recurso:Asigne el comentario a la publicación emitiendo un
PUT
al 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
Comment
a laPost
y también evitaría laCommentRepository
completamente. 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