java – Spring数据REST加入继承问题

前端之家收集整理的这篇文章主要介绍了java – Spring数据REST加入继承问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在一个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")

它会生成您期望的资源路径!

希望这可以帮助 :)

猜你在找的Java相关文章