通过JpaRepository更新实体

时间:2017-04-14 22:32:11

标签: java spring hibernate jpa spring-data-jpa

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

@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;

}

我在我的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);

}

但是当我试图在数据库提供程序类中调用update方法时,我得到了异常:

  

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

首先,您必须从数据库中读取它(用于填充ID变量),然后才能更新该对象。 如果pojo中存在id,则save函数将对其进行更新;如果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