嵌套异常是javax.persistence.EntityNotFoundException

时间:2017-08-14 19:33:02

标签: spring spring-data

我在项目中使用spring boot和spring数据,我有两个类:

class Mission implements Serializable { private static final long 
serialVersionUID = 1L;
@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
private Long              id;
private String            departure;
private String            arrival;
private Boolean           isFreeWayEnabled;
@OneToMany( mappedBy = "mission" )
private List<Station>     stations;
// getters and setters
}

,第二堂课是:

@Entity
public class Station implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
private Long              id;
private String            station;

@ManyToOne( fetch = FetchType.LAZY )
@JsonBackReference
private Mission           mission;
//getters and setters
 }

添加任务的Methode:

public Mission addMision( Mission mission ) {
// TODO Auto-generated method stub
// Mission mission = getMissionById( mission.getId() );
for ( Station station : mission.getStations() ) {
    station.setMission( mission );
    stationRepository.save( station );
}
return missionRepository.save( mission );
}

当我尝试添加新任务时,它会出现此错误:

  

&#34;无法找到ID为2的com.carpooling.entity.Station;嵌套异常是javax.persistence.EntityNotFoundException:无法找到ID为2&#34的com.carpooling.entity.Station;

继发JSON对象已发送:

  

{&#34;离开&#34;:&#34; FFF&#34;&#34;到达&#34;:&#34; FFFF&#34;&#34; isFreeWayEnabled&#34;:假&#34;站&#34;:[{&#34; ID&#34;:1},{&#34; ID&#34;:2}]}

2 个答案:

答案 0 :(得分:0)

你可能需要稍微改变一下。

如果使用@ManyToOne,则引用的实体必须存在。否则,将该字段指定为已有的long,并通过单独的查询检索引用的实体。

如果无法找到所请求的实体,它会抛出异常(javax.persistence.EntityNotFoundException)而不是返回null。

如果您是延迟加载而不是手动处理此异常,请使用@NotFound批注来解决此异常。我已经给出了语法..

@ManyToOne(
    fetch = FetchType.LAZY)
@NotFound(
    action = NotFoundAction.IGNORE)
@JoinColumn(
    name = COLUMN,
    referencedColumnName = COLUMN,
    insertable = false,
    updatable = false)
private Mission mission;

答案 1 :(得分:0)

如果您做对了...

在我的情况下,该错误是由于尝试对非@ElementCollection对象(实际上是Map )的映射使用@Embeddable注释。

我的解决方案通过一种扁平的方式来映射对象,以使它们可以被JPA接受。详细信息摆脱了充当聚合器的父实体,并手动保存了它持有的不同集合(三个存储库而不是一个,三个save()调用而不是一个,少了一个表)。