【发布时间】:2017-09-11 05:11:08
【问题描述】:
我正在尝试更新与我的数据库中的 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);
}
但是当我尝试在数据库提供程序类中调用更新方法时,我遇到了异常:
org.hibernate.TransientObjectException: 对象引用了一个未保存的对象 瞬态实例 - 在刷新之前保存瞬态实例: pl.hypeapp.core.entity.database.TvShowLocal;嵌套异常是 java.lang.IllegalStateException: org.hibernate.TransientObjectException:对象引用了一个未保存的 瞬态实例 - 在刷新之前保存瞬态实例: pl.hypeapp.core.entity.database.TvShowLocal
有什么问题?我怎样才能以正确的方式进行这样的操作?
【问题讨论】:
-
这个查询没有多大意义。更新用于更新实体的一个或多个属性。不要用另一个实体代替一个实体。我认为您正在寻找
repository.save(tvShowLocal)。你想达到什么目的? -
@JBNizet 出于某种原因 repository.save(tvShowLocal) 添加新记录而不是更新。我正在尝试更新我的数据库中的整个记录。
-
这很可能是因为您保存的 TvShowLocal 没有任何 ID。所以它被认为是新的,因此被插入。
标签: java spring hibernate jpa spring-data-jpa