Java – spring data rest adds inheritance issues
I have a spring database on a JPA entity The entity is subclassed through connection inheritance
At least automatically, spring data rest seems to have a problem explaining this structure Or maybe I misunderstood inheritance Usage of joined
The request of any entity with an event will return the following:
{ cause: null,message: "Cannot create self link for class com.foo.event.SubEvent! No persistent entity found!" }
Maybe I asked the project too much about how to deal with this problem, but is there a solution to group all events under the same event? Maybe even allow me to filter types?
I have left the basics of the application structure below
Event. java
@Entity @Inheritance(strategy = InheritanceType.JOINED) @JsonTypeInfo(use = Id.NAME,include = As.PROPERTY,property = "type") @JsonSubTypes({ @Type(value = SubEvent.class),... }) ... public class Event { @Id private long id; ... }
SubEvent. java
@Entity public class SubEvent extends Event { private String code; ... }
EventRepository. java
@RepositoryRestResource(path = "events") public interface EventRepository extends PagingAndSortingRepository<Event,Long> { ... }
Solution
I don't think you used discriminator to let JPA know what subclasses a given object uses (how does it know?)
I prefer to use abstract classes to represent the hierachies of each subclass, so here is an example suitable for you:
Event. java
@Entity @DiscriminatorColumn(name = "type") @Inheritance(strategy = InheritanceType.JOINED) public abstract class Event { @Id @GeneratedValue public Long id; public String type; }
SubEvent. java
@Entity @DiscriminatorValue("subevent") @PrimaryKeyJoinColumn(name = "event_id") public class PeeringService extends Service { private String code; }
Using the above code, you will notice some strange things - when generating the resource path of one of these objects, it assumes that you have a repository for each subclass, and generates the following:
{ "type" : "subevent","code" : "bacon","_links" : { "self" : { "href" : "http://localhost:8081/subEvents/1" },"peeringService" : { "href" : "http://localhost:8081/subEvents/1" } } }
This is easy to solve, but you only need to add the following comments to your base class:
@RestResource(path = "events")
It will generate the resource path you expect!
I hope this helps:)