如何解决非空属性引用一个瞬态值
我在请求引发内部服务器错误500(这是我的模型)时遇到问题
当我从前端发送请求时,抛出一个错误,并显示以下消息“ Not-null属性引用了一个瞬态值-必须在当前操作之前保存瞬态实例”,而邮递员向我显示此信息 “ transientEntityName”:“ com.baufest.tennis.springtennis.model.Entrenador”, “ propertyOwnerEntityName”:“ com.baufest.tennis.springtennis.model.Jugador”, “ propertyName”:“ entrenador”, “ message”:“非null属性引用一个瞬态值-必须在当前操作之前保存瞬态实例:com.baufest.tennis.springtennis.model.Jugador.entrenador-> com.baufest.tennis.springtennis.model.Entrenador” , “被抑制”:[], “ localizedMessage”:“非null属性引用一个瞬态值-必须在当前操作之前保存瞬态实例:com.baufest.tennis.springtennis.model.Jugador.entrenador-> com.baufest.tennis.springtennis.model.Entrenador” }, “被抑制”:[], “ localizedMessage”:“ org.hibernate.TransientPropertyValueException:非null属性引用一个瞬态值-必须在当前操作之前保存瞬态实例:com.baufest.tennis.springtennis.model.Jugador.entrenador-> com.baufest.tennis。 springtennis.model.Entrenador;嵌套异常是java.lang.IllegalStateException:org.hibernate.TransientPropertyValueException:非null属性引用了一个瞬态值-瞬态实例必须在当前操作之前保存:com.baufest.tennis.springtennis.model.Jugador .entrenador-> com.baufest.tennis.springtennis.model.Entrenador”
@Entity
@Table(name = "Jugador")
public class Jugador{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String nombre;
@Column(nullable = false)
private int puntos;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "idEntrenador",nullable = false)
private Entrenador entrenador;
控制器
@RestController
@CrossOrigin
@RequestMapping("springtennis/api/v1/jugadores")
public class JugadorController {
private final JugadorService jugadorService;
@Autowired
public JugadorController(JugadorService jugadorService) {
this.jugadorService = jugadorService;
}
@GetMapping("")
public ResponseEntity<List<JugadorDTO>> listAll() {
return ResponseEntity.ok(jugadorService.listAll());
}
@GetMapping("/{id}")
public ResponseEntity<JugadorDTO> getById(@PathVariable Long id) {
return ResponseEntity.ok(jugadorService.getById(id));
}
@PostMapping(value = "")
public ResponseEntity<Long> saveJugador(@RequestBody JugadorDTO jugador) {
JugadorDTO savedJugador = jugadorService.save(jugador);
return new ResponseEntity<>(savedJugador.getId(),HttpStatus.CREATED);
}
@PutMapping(value = "/{id}")
public ResponseEntity<Long> updateJugador(@PathVariable Long id,@RequestBody JugadorDTO jugador) {
jugador.setId(id);
JugadorDTO updatedJugador = jugadorService.update(jugador);
return ResponseEntity.ok(updatedJugador.getId());
}
@DeleteMapping(value = "/{id}")
public ResponseEntity<Void> deleteJugador(@PathVariable Long id) {
jugadorService.delete(id);
return new ResponseEntity<>(HttpStatus.OK);
}
@PutMapping(value = "/{id}/actions/recalculateranking")
public ResponseEntity<Void> recalculateranking(@PathVariable Long id) {
jugadorService.recalculateranking(id);
return new ResponseEntity<>(HttpStatus.OK);
}
服务
@Service
public class JugadorServiceImpl implements JugadorService {
public static final String PLAYER_WITH_ID = "Player with id = ";
public static final String DOES_NOT_EXIST = " does not exist.";
public static final String ALREADY_EXISTS = " already exists.";
private final JugadorRepository jugadorRepository;
private final PartidoRepository partidoRepository;
private final JugadorMapper jugadorMapper;
@Autowired
public JugadorServiceImpl(JugadorRepository jugadorRepository,PartidoRepository partidoRepository,JugadorMapper jugadorMapper) {
this.jugadorRepository = jugadorRepository;
this.partidoRepository = partidoRepository;
this.jugadorMapper = jugadorMapper;
}
@Override
public List<JugadorDTO> listAll() {
return jugadorRepository.findAllByOrderByNombreAsc().stream()
.map(this.jugadorMapper::toDTO)
.collect(Collectors.toList());
}
@Override
public JugadorDTO getById(Long id) {
return jugadorRepository.findById(id).map(this.jugadorMapper::toDTO)
.orElseThrow(() -> new NoSuchElementException(PLAYER_WITH_ID + id + DOES_NOT_EXIST));
}
@Override
public JugadorDTO save(JugadorDTO jugador) {
boolean exists = jugador.getId() != null && jugadorRepository.existsById(jugador.getId());
if (exists) {
throw new IllegalArgumentException(PLAYER_WITH_ID + jugador.getId() + ALREADY_EXISTS);
}
return this.jugadorMapper.toDTO(jugadorRepository.save(this.jugadorMapper.fromDTO(jugador)));
}
@Override
public JugadorDTO update(JugadorDTO jugador) {
boolean exists = jugadorRepository.existsById(jugador.getId());
if (!exists) {
throw new NoSuchElementException(PLAYER_WITH_ID + jugador.getId() + DOES_NOT_EXIST);
}
return this.jugadorMapper.toDTO(jugadorRepository.save(this.jugadorMapper.fromDTO(jugador)));
}
@Override
public void delete(Long id) {
boolean exists = jugadorRepository.existsById(id);
if (!exists) {
throw new NoSuchElementException(PLAYER_WITH_ID + id + DOES_NOT_EXIST);
}
jugadorRepository.deleteById(id);
}
@Override
public JugadorDTO recalculateranking(Long id) {
Optional<Jugador> optJugador = jugadorRepository.findById(id);
if (optJugador.isPresent()) {
Jugador jugador = optJugador.get();
List<Partido> partidos = partidoRepository.findAll();
// Define las constantes con los indices definidos para el calculo
final int INDICADOR_GANADOS_LOCAL = 10;
final int INDICADOR_GANADOS_VISITANTE = 15;
final int INDICADOR_PERDIDOS_LOCAL = -5;
// Inicializa el ranking inicial
int ranking = 0;
List<Partido> partidosGanadoslocal;
List<Partido> partidosGanadosVisitante;
List<Partido> partidosPerdidoslocal;
partidosGanadoslocal = listPartidosGanadoslocalDeJugador(id,partidos);
partidosGanadosVisitante = listPartidosGanadosVisitanteDeJugador(id,partidos);
partidosPerdidoslocal = listPartidosPerdidoslocalDeJugador(id,partidos);
// Realiza el calculo por cada indicador
ranking += partidosGanadoslocal.size() * INDICADOR_GANADOS_LOCAL;
ranking += partidosGanadosVisitante.size() * INDICADOR_GANADOS_VISITANTE;
ranking += partidosPerdidoslocal.size() * INDICADOR_PERDIDOS_LOCAL;
// Si el ranking obtenido es menor a 0 se setea en 0
ranking = Math.max(ranking,0);
// Se resetean los puntos en el jugador
jugador.setPuntos(ranking);
return this.jugadorMapper.toDTO(jugadorRepository.save(jugador));
} else{
throw new NoSuchElementException(PLAYER_WITH_ID + id + DOES_NOT_EXIST);
}
}
private List<Partido> listPartidosGanadoslocalDeJugador(Long id,List<Partido> partidos) {
List<Partido> partidosFilTrados = new ArrayList<>();
for(Partido p : partidos){
if(p.getEstado() == Estado.FINALIZADO && p.getJugadorLocal().getId().equals(id) && p.getCantidadGamesLocal() == 6)
partidosFilTrados.add(p);
}
return partidosFilTrados;
}
private List<Partido> listPartidosGanadosVisitanteDeJugador(Long id,List<Partido> partidos) {
List<Partido> partidosFilTrados = new ArrayList<>();
for(Partido p : partidos){
if(p.getEstado() == Estado.FINALIZADO && p.getJugadorVisitante().getId().equals(id) && p.getCantidadGamesVisitante() == 6)
partidosFilTrados.add(p);
}
return partidosFilTrados;
}
private List<Partido> listPartidosPerdidoslocalDeJugador(Long id,List<Partido> partidos) {
List<Partido> partidosFilTrados = new ArrayList<>();
for(Partido p : partidos){
if(p.getEstado() == Estado.FINALIZADO && p.getJugadorLocal().getId().equals(id) && p.getCantidadGamesVisitante() == 6)
partidosFilTrados.add(p);
}
return partidosFilTrados;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。