我在一个JPA实体上有一个
Spring数据库.该实体通过连接继承进行子类化.
至少自动地,Spring Data REST似乎有一个解释这个结构的问题.或者也许我误会了Inheritance.JOINED的用法
任何有事件的实体的请求都将返回以下内容:
{ cause: null,message: "Cannot create self link for class com.foo.event.SubEvent! No persistent entity found!" }
也许我问这个项目太多了解如何处理这个问题,但是有没有一个解决办法可以将所有的事件分组在同一个事件下?也许甚至允许我过滤类型?
我已经留下了下面的应用程序结构的基础知识.
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> { ... }
解决方法
我想你没有使用Discriminator来让JPA了解给定对象使用什么子类(它如何知道?).
我倾向于使用抽象类来表示每个子类的hireachies,所以这里是一个适合你的例子:
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; }
使用上面的代码,你会注意到一些奇怪的东西 – 当生成这些对象之一的资源路径时,它假设你有一个Repository为每个子类,并生成如下所示:
{ "type" : "subevent","code" : "bacon","_links" : { "self" : { "href" : "http://localhost:8081/subEvents/1" },"peeringService" : { "href" : "http://localhost:8081/subEvents/1" } } }
@RestResource(path = "events")
它会生成您期望的资源路径!
希望这可以帮助 :)