我尝试在我的数据库中更新与 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
有什么问题?我怎么能以正确的方式做这样的操作?
答案 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