java – Spring数据REST加入继承问题
发布时间:2020-10-19 06:45:00 所属栏目:Java 来源:互联网
导读:我在一个JPA实体上有一个 Spring数据库.该实体通过连接继承进行子类化. 至少自动地,Spring Data REST似乎有一个解释这个结构的问题.或者也许我误会了Inheritance.JOINED的用法 任何有事件的实体的请求都将返回以下内容: { cause: null, message: Cannot crea
|
我在一个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") 它会生成您期望的资源路径! 希望这可以帮助 :) (编辑:鄂州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
