Java 通过JpaRepository更新实体
我正在尝试更新数据库中与tvshowapid属性匹配的实体。我有这样的实体: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_
@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没有关联。发生暂时异常时,其中任何一个对象都不会保存。