如何构建JPA entites和JSON模型?

时间:2017-04-11 17:50:14

标签: java json spring jpa model

我的Spring应用程序使用JSON API然后使用JPA将其保存在数据库中。我正确地设计了适当的设施和模型。

我的模型JSON看起来像:

@Data
@Setter(AccessLevel.NONE)
@JsonIgnoreProperties(ignoreUnknown = true)
public class TvShowRemote implements TvShowEntity {
    @JsonProperty("id")
    public Integer id;
    @JsonProperty("url")
    public String url;
    @JsonProperty("name")
    public String name;
    @JsonProperty("summary")
    public String summary;
    @JsonProperty("updated")
    public Integer updated;
    @JsonProperty("_embedded")
    public Embedded embedded;

    public List<SeasonEntity> getSeasons() {
        return new ArrayList<SeasonEntity>(embedded.getSeasons());
    }

    public List<EpisodeEntity> getEpisodes() {
        return new ArrayList<EpisodeEntity>(embedded.getEpisodes());
    }
}

我的JPA entites看起来像:

@Data
@Setter(AccessLevel.NONE)
@Entity
@Table(name = "TvShows")
public class TvShowLocal implements TvShowEntity {

    @Id
    @GeneratedValue
    public Integer id;

    public Integer tvShowId;

    public String name;

    public Integer runtime;

    public String summary;

    @Column(name = "seasons")
    @OneToMany
    @ElementCollection(targetClass = SeasonLocal.class)
    public List<SeasonLocal> seasons;

    @Column(name = "episodes")
    @OneToMany
    @ElementCollection(targetClass = EpisodeLocal.class)
    public List<EpisodeLocal> episodes;

    @Override
    public List<SeasonEntity> getSeasons() {
        return new ArrayList<SeasonEntity>(seasons);
    }

    @Override
    public List<EpisodeEntity> getEpisodes() {
        return new ArrayList<EpisodeEntity>(episodes);
    }
}

Lombok注释@Data自动实现getter / setter。 我试图实现两个类接口:

public interface TvShowEntity {

    Integer getId();

    String getName();

    List getSeasons();

    List getEpisodes();
}

我还在SeasonRemote,SeasonLocal,EpisodeRemote,EpisodeLocal中实现了两个界面SeasonEntity,EpisodeEntity。它们看起来像上面的例子。

现在我尝试将TvShowRemote分配给TvShowLocal;

TvShowEntity tvshowEntity = new TvShowRemote();
TvShowLocal tvShowLocal = (TvShowLocal) tvShowEntity;

但是我不能像这样抛弃这个对象。 是否有更好的方法来实现这一目标?

2 个答案:

答案 0 :(得分:1)

TvShowEntity tvshowEntity = new TvShowRemote();
TvShowLocal tvShowLocal = (TvShowLocal) tvShowEntity;

您正试图实现无法完成的不可能演员。

TvShowRemoteTvShowEntity

TvShowLocalTvShowEntity

这并不意味着TvShowRemoteTvShowLocal,反之亦然。

您可以使用适配器设计模式。

答案 1 :(得分:0)

我看到TvShowEntity和TvShowLocal都扩展了TvShowEntity。 但是你不能将TvShowEmity实例化为TvShowRemote到TvShowLocal。

来自Wideskills

  

强制转换可以是它自己的类类型,也可以是它的一个子类或超类类型或接口。

您应该手动将属性从TvShowRemote复制到TvShowLocal,或者如果声明所有需要的方法接口,则只需使用超类型TvShowEntity。