I managed to solve this problem without exporting the reference repository. This is adding annotations on top of the interface. In your example, it will be like this:
@RepositoryRestResource(exported = false) public interface AddressRepository extends CrudRepository<Address, Long> { }
This partially fixes the problem since Spring Data will not distribute foreign keys for you. However, it will be stored in your Person and address (without reference to the person who belongs). Then, if we made another API call to update these missing foreign keys, you could get the person through the API with all its associated addresses - as @Francesco Pitzalis noted
I hope this helps. Just the last note. I am still working on this because I find it ridiculous (as well as basic and necessary) that Hibernate cannot distribute foreign keys for us. It should be possible somehow.
EDITED: Indeed, it was possible. In the implementation below, the entity and its children can be stored, distributing foreign keys to them for the architecture based on Spring Data (Rest - how we place repositories), Hibernate 5.0.12Final and MySQL with InnoDB storage mechanism (not in the database).
@Entity public class Producto implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nombre; @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) @JoinColumn(name = "producto_id") private List<Formato> listaFormatos; //Constructor, getters and setters }
https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/JoinColumn.html - This was important.
@Entity public class Formato implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Integer cantidad; private String unidadMedida; @ManyToOne private Producto producto; //Constructor, getters and setters } @RepositoryRestResource public interface ProductoRepository extends CrudRepository<Producto, Long> { } @RepositoryRestResource public interface FormatoRepository extends CrudRepository<Formato, Long> { } spring.datasource.url=jdbc:mysql://localhost:3306/(database name) spring.datasource.username=(username) spring.datasource.password=(password) spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
This is extremely important. You need to know where Hibernate runs SQL statements in order to properly install the dialect. For me, the storage engine for my tables is InnoDB. The following link helped. What mysql driver am i using with spring / hibernate?
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-rest</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
The only thing that I could not explain was that now I can export the "child" repository, and it still works fine. Any ideas guys?