微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

非空属性引用一个瞬态值

如何解决非空属性引用一个瞬态值

我在请求引发内部服务器错误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 举报,一经查实,本站将立刻删除。