Java 通过JpaRepository更新实体

Java 通过JpaRepository更新实体,java,spring,hibernate,jpa,spring-data-jpa,Java,Spring,Hibernate,Jpa,Spring Data Jpa,我正在尝试更新数据库中与tvshowapid属性匹配的实体。我有这样的实体: @Data @Setter(AccessLevel.NONE) @Builder @Entity @Table(name = "tv_shows") public class TvShowLocal implements TvShowEntity<SeasonLocal, EpisodeLocal> { @Id @GeneratedValue @Column(name = "tv_

我正在尝试更新数据库中与tvshowapid属性匹配的实体。我有这样的实体:

@Data
@Setter(AccessLevel.NONE)
@Builder
@Entity
@Table(name = "tv_shows")
public class TvShowLocal implements TvShowEntity<SeasonLocal, EpisodeLocal> {

    @Id
    @GeneratedValue
    @Column(name = "tv_show_id")
    private Integer id;

    private String tvShowApiId;

    @Lob
    @Column(length = 100000)
    private String summary;

    private Integer updated;

    @OneToMany(cascade = CascadeType.ALL)
    @ElementCollection(targetClass = SeasonLocal.class)
    @JoinColumn(name = "tv_show_id")
    @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
    private List<SeasonLocal> seasons;

    @OneToMany(cascade = CascadeType.ALL)
    @ElementCollection(targetClass = EpisodeLocal.class)
    @JoinColumn(name = "tv_show_id")
    @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
    private List<EpisodeLocal> episodes;

}
@数据
@Setter(AccessLevel.NONE)
@建筑商
@实体
@表(name=“电视节目”)
公共类TvShowLocal实现TvShowEntity{
@身份证
@生成值
@列(name=“tv\u show\u id”)
私有整数id;
私有字符串TVShowapid;
@高球
@列(长度=100000)
私有字符串摘要;
私有整数更新;
@OneToMany(级联=级联类型.ALL)
@ElementCollection(targetClass=SeasonLocal.class)
@JoinColumn(name=“tv\u show\u id”)
@级联(org.hibernate.annotations.CascadeType.SAVE\u UPDATE)
私人列表季节;
@OneToMany(级联=级联类型.ALL)
@ElementCollection(targetClass=eposodeLocal.class)
@JoinColumn(name=“tv\u show\u id”)
@级联(org.hibernate.annotations.CascadeType.SAVE\u UPDATE)
私人名单剧集;
}
我在我的JpaRepository中写了@Query:

public interface TvShowRepository extends JpaRepository<TvShowLocal, Integer> {

    @Modifying
    @Transactional
    @Query("UPDATE TvShowLocal tv SET tv = :tvShow WHERE tv.tvShowApiId = :id")
    void update(@Param("tvShow")TvShowLocal tvShowLocal, @Param("id") String tvShowApiId);

}
公共界面TvShowRepository扩展了JpaRepository{
@修改
@交易的
@查询(“更新TvShowLocal tv=:tvShow WHERE tv.TVShowAPID=:id”)
无效更新(@Param(“tvShow”)TvShowLocal TvShowLocal,@Param(“id”)字符串TVShowApid);
}
但当我试图在数据库提供程序类中调用update方法时,出现异常:

org.hibernate.transientObject异常:对象引用未保存的 瞬态实例-刷新前保存瞬态实例: pl.hypeapp.core.entity.database.TvShowLocal;嵌套异常是 java.lang.IllegalStateException: org.hibernate.transientObject异常:对象引用未保存的 瞬态实例-刷新前保存瞬态实例: pl.hypeapp.core.entity.database.TvShowLocal


有什么问题?我怎样才能以正确的方式进行这样的操作

错误表示您试图保存的对象尚未插入数据库。 您可以按顺序执行以下操作: 1.插入TvShowLocal。
2.执行更新。

首先必须从数据库中读取它(用于填充ID变量),然后才能更新对象。 如果pojo中存在id,则保存函数将更新该id,如果id没有值,则保存该id

用于更新现有对象

TvShowLocal tvShowLocal = TvShowRepository.getOne(id); 

TvShowRepository.save(tvShowLocal); // tvShowLocal will be update
用于保存新对象

TvShowLocal tvShowLocal2=new  TvShowLocal(); //New Object
TvShowRepository.save(tvShowLocal2);   //tvShowLocal2 will be save as new object

这个问题没有多大意义。更新用于更新实体的一个或多个属性。不要用另一个实体替换一个实体。我想您正在寻找
repository.save(tvShowLocal)
。您试图实现什么目标?@JBNizet出于某种原因存储库。保存(tvShowLocal)添加新记录而不是更新。我正在尝试更新数据库中的整个记录。这很可能是因为您正在保存的TvShowLocal没有任何ID。因此它被认为是新的,因此被插入。Alex,对象在更新之前被插入到数据库中。SeasonLocal和EpisodeLocal如何,它们可能与TvShowLocal没有关联。发生暂时异常时,其中任何一个对象都不会保存。