我在一个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")
它会生成您期望的资源路径!
希望这可以帮助 :)
