JPA не сохраняет свойства в базе данных MYSQL - PullRequest
1 голос
/ 17 апреля 2020

Я изучаю загрузку Spring прямо сейчас, и я использую ее в качестве бэкэнда, и я использую React в качестве внешнего интерфейса.

Я сохраняю данные через JPA Hibernate, каждое свойство сохраняется правильно, но имя_команды является не сохраняется, и я не знаю, почему он не сохраняется, я надеюсь, что вы можете помочь мне с этим.

Мой MySQL настольный проигрыватель имеет 4 свойства: id - это первичный ключ, age, name , team_name как внешний ключ

Тогда у таблицы MySQL Team есть одно имя свойства, которое является первичным ключом. И как вы можете видеть в коде Java, игрок и команда находятся в отношениях.

И когда я могу зарегистрировать свойство this.state.team, оно дает мне имя команды, оно не равно нулю, оно просто не сохраняется в таблице MySQL.

Обновленный код:

Java Объект игрока:

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Player {

    @Id
    private String id;


    private String name;
    private String age;

    @ManyToOne 
    @JsonBackReference
    private Team team;


}

Java Элемент команды:

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Team {

    @Id
    private String name;

    @JsonManagedReference
    @OneToMany(mappedBy = "team")
    private List<Player> players;

}

Код реакции:

class Player extends Component {

    constructor(){
        super();
        this.state={
            player:{},
            playerName: null,
            id:null,
            flag:null,
            age:null,
            team:null,
            name: null
    }
    this.handleSubmit = this.handleSubmit.bind(this);
    this.handleChange = this.handleChange.bind(this);
    this.getPlayerData = this.getPlayerData.bind(this)
    }

    async getPlayerData(playerName){
        const proxyurl = "https://cors-anywhere.herokuapp.com/";    
        const url = "https://www.hltv.org/search?term=" + playerName
        const fullUrl= proxyurl+url
        const response = await fetch(fullUrl)
        const arr = await response.json()
        const player = arr[0].players[0];
        const fullName= player.firstName + " " + player.lastName


         this.setState({
            playerName: player.nickName,
            id: player.id,
            flag: player.flagUrl,
            age:null,
            team:{
                name: player.team.name
            },
            name: fullName

        })
    }

    async createNonExistingTeam(){
        const teamData={
            name:this.state.team.name
        }

         await fetch("/api/team" , {
            method: 'POST' ,
            headers : {
              'Accept' : 'application/json',
              'Content-Type' : 'application/json'
            },
            body: JSON.stringify(teamData)
        })
    }

    async createNonExistingPlayer(){
        const data={
            id: this.state.playerName,
            age: null,
            name:this.state.name,
            team_name: this.state.team.name
        }
        await fetch("/api/player" , {
            method: 'POST' ,
            headers : {
              'Accept' : 'application/json',
              'Content-Type' : 'application/json'
            },
            body: JSON.stringify(data)
        })
        await this.handleSubmit()
    }


    async handleSubmit(event){
        const {playerName} = this.state


            try{
                const response =  await fetch(`/api/player/${playerName}` , {
                    method: 'GET' ,
                    headers : {
                      'Accept' : 'application/json',
                      'Content-Type' : 'application/json'
                    }})
                const output = await response.json();
                this.setState({
                    player:output
                })
            } catch(e){

                await this.getPlayerData(playerName)
                await this.createNonExistingTeam()
                await this.createNonExistingPlayer()

            }

        const style = {
            marginTop: 20,
            marginLeft: 30
        }

        const {player} = this.state
        const {playerData} = this.state
        const {flag} = this.state
        const {id} = this.state



const picLink = "https://static.hltv.org//images/playerprofile/bodyshot/compressed/" + id + ".png"
        const data = 
        <div>
            <PlayerData
                style={style} 
                ign={player.id}
                name={player.name} 
                pic={picLink}
                nation={flag}
                age={player.age}

            />

        </div>



        ReactDOM.render(data,document.getElementById('playerData'))


}





    async handleChange(event) {
        this.setState({
          [event.target.name]: event.target.value
        });
    }

РЕДАКТИРОВАТЬ Код контроллера:

PlayerController:

@RestController
@RequestMapping("/api")
public class PlayerController {

    @Autowired
    private PlayerRepository playerRepository;

    @GetMapping("/players")
    List<Player>getAllPlayers(){
        return playerRepository.findAll();
    }

    @PostMapping("/player")
    ResponseEntity<Player> createPlayer(@Valid @RequestBody Player player) throws URISyntaxException{
        Player result = playerRepository.save(player);

        return ResponseEntity.created(new URI("/api/player" + result.getId())).body(player);
    }

    @GetMapping("/player/{id}")
    ResponseEntity<?> getPlayer(@PathVariable String id){
        Optional<Player>result =  playerRepository.findById(id);
        ResponseEntity<Player> resMap = result.map(response->ResponseEntity.ok().body(response)).orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND));
        return resMap;
    }

    @GetMapping("/{name}/players")
    List<Player> findPlayers(@PathVariable Team name){
        return playerRepository.findByTeam(name);
    }
}

TeamController:

@RestController
@RequestMapping("/api")
public class TeamController {

    @Autowired
    private TeamRepository tRepository;

    @PostMapping("/team")
    ResponseEntity<Team> createTeam(@Valid @RequestBody Team team) throws URISyntaxException{
        Team result = tRepository.save(team);

        return ResponseEntity.created(new URI("/api/team/" + result.getName())).body(team);
    }


    }

EDIT:

Я понял, что когда я печатаю своего игрока в методе создания игрока в Java, команда отображается как NULL, поэтому я предполагаю, что у меня есть проблема в моем запросе POST.

Ответы [ 3 ]

0 голосов
/ 17 апреля 2020

Ваш внешний компонент Player не представляет отношения сущностей Player и Team.

Это должно быть:

{
    playerName: player.nickName,
    id: player.id,
    flag: player.flagUrl,
    age:null,
    team:{
            name:player.team.name
        },
    name: fullName
}
0 голосов
/ 17 апреля 2020

Я исправил свою проблему. Я понял, что у меня была ошибка в моем запросе POST. Я изменил свой метод getPlayerData следующим образом:

this.setState({
            playerName: player.nickName,
            id: player.id,
            flag: player.flagUrl,
            age:null,
            team:{
                name: player.team.name
            },
            name: fullName
            })

И в своем запросе POST я создал новую переменную.

const dat={
   name: this.state.team.name
}    

И изменил свой объект данных следующим образом:

const data={
            id: this.state.playerName,
            age: null,
            name:this.state.name,
            team: dat
        }
0 голосов
/ 17 апреля 2020

Ваше отображение неверно, и вы можете удалить аннотацию @Table, поскольку она избыточна.

Также не следует использовать аннотацию @Data, поскольку это может вызвать ошибку StackOverflowError с двунаправленными ссылками.

Сначала используйте @ManyToOne вместо @OneToOne:

@Entity
@Getter @Setter
@NoArgsConstructor
@AllArgsConstructor
public class Player {

    @Id
    private String id;

    private String name;
    private String age;

    @ManyToOne 
    @JsonBackReference
    private Team team;
}

Затем вы должны использовать атрибут mappedBy, чтобы сообщить JPA, что существует обратная ссылка:

@Entity
@Getter @Setter
@NoArgsConstructor
@AllArgsConstructor
@Table(name="team")
public class Team {

    @Id
    private String name;

    @JsonManagedReference
    @OneToMany(mappedBy = "team")
    private List<Player> players;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...