0
votes

I'm still trying to figure what exactly it is I am asking but this is fallout from a discussion in the office. So the dilemma is that on a mapping set to eager with a repository defined for the entity the mapping is to, a link is produced. Some of the time that is fine but some of the time I'd rather have the object fetched itself. If there is not a repository defined for that entity then that is what will occur with the eager fetch strategy. What would be ideal is if I could pass in a parameter and have the existence of that repository disappear or reappear.

2

2 Answers

1
votes

Not totally following, but either the repo exists or not. If you want to be able to access entities of type X independently of other entity types, then you have to define a repo for type X.

1
votes

I think you could achieve something similar using projections.

So you define define a repository for your association entity. By default spring data rest will just render a link to this entity and not embed it in the response.

Then you define a projection with a getter for your associated entity. You can choose on the client side if you want the projection by adding the projection query parameter.

So lets say you have a person with an address - an exported repository exists for Person and Address:

@Entity
public class Person {

  @Id @GeneratedValue
  private Long id;
  private String firstName, lastName;

  @OneToOne
  private Address address;
  …
}


interface PersonRepository extends CrudRepository<Person, Long> {}


interface AddressRepository extends CrudRepository<Address, Long> {}

Your projection could look like this:

@Projection(name = "inlineAddress", types = { Person.class }) 
interface InlineAddress {

  String getFirstName();

  String getLastName();

  Address getAddress(); 
}

And if you call http://localhost/persons/1?projection=inlineAddress you have the address embedded - and by default it is just linked.