【问题标题】:Nested exception is javax.persistence.EntityNotFoundException嵌套异常是 javax.persistence.EntityNotFoundException
【发布时间】:2017-08-14 19:33:01
【问题描述】:

我在我的项目中使用 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
 }

添加任务的方法:

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 );
}

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

“无法找到 id 为 2 的 com.carpooling.entity.Station;嵌套异常是 javax.persistence.EntityNotFoundException:无法找到 id 为 2 的 com.carpooling.entity.Station”

这是发送的 JSON 对象:

{"departure":"fff","arrival":"ffff","isFreeWayEnabled":false,"stations":[{"id":1},{"id":2}]}

【问题讨论】:

标签: spring spring-data


【解决方案1】:

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

如果使用@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;

【讨论】:

  • 感谢您的回答..但是 COLUMN 字段是什么??
  • 外键列的名称。以及此外键列引用的列的名称。这些是可选字段。您可能希望相应地拥有这些列名。
  • 我刚刚添加了一个投票,因为这是解决我项目中相同问题的答案,谢谢,这应该是接受的答案@surya
【解决方案2】:

如果你做对了……

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

我的解决方案以更扁平的方式映射对象,以使它们受到 JPA 的喜爱。细节是摆脱充当聚合器的父实体并手动保存它所持有的不同集合(三个存储库而不是一个,三个 save() 调用而不是一个,少一个表)。

【讨论】:

    猜你喜欢
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2023-02-06
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多