我的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;
但是我不能像这样抛弃这个对象。 是否有更好的方法来实现这一目标?
答案 0 :(得分:1)
TvShowEntity tvshowEntity = new TvShowRemote();
TvShowLocal tvShowLocal = (TvShowLocal) tvShowEntity;
您正试图实现无法完成的不可能演员。
TvShowRemote
是TvShowEntity
和
TvShowLocal
是TvShowEntity
这并不意味着TvShowRemote
是TvShowLocal
,反之亦然。
您可以使用适配器设计模式。
答案 1 :(得分:0)
我看到TvShowEntity和TvShowLocal都扩展了TvShowEntity。 但是你不能将TvShowEmity实例化为TvShowRemote到TvShowLocal。
来自Wideskills:
强制转换可以是它自己的类类型,也可以是它的一个子类或超类类型或接口。
您应该手动将属性从TvShowRemote复制到TvShowLocal,或者如果声明所有需要的方法接口,则只需使用超类型TvShowEntity。