首页 > 解决方案 > 在 Spring 中建立 OneToMany 关系后,我无法获取映射的对象

问题描述

我正在尝试构建具有 OneToMany 关系的 REST 应用程序。Komentari 可以有一个用户,用户可以有多个 Komentari(评论)。在尝试从 Komentari 类中获取映射的用户之后,我得到了用户的空值。
我的用户类:

@Entity
@Table(name = "users")
public class Users {

    @Id
    @Column
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id = 0;
    @Column(name = "username")
    private String username;
    @Column(name="email")
    private String email;
    @Column(name="password")
    private String password;
    @Column(name = "enabled")
    private boolean enabled = true;

    @ManyToOne(fetch = FetchType.LAZY, targetEntity = Fakultet.class, cascade=CascadeType.ALL)
    @JoinColumn(name="id_fakulteta", nullable = false)
    private Fakultet faks;

    @ManyToMany
    @JoinTable(
            name = "Room_has_Tag",
            joinColumns = @JoinColumn(name = "Room_idRoom"),
            inverseJoinColumns = @JoinColumn(name = "users_id"))
    Set<Room> rooms;

    @OneToMany(mappedBy = "users")
    private List<Komentari> komentari;

    public Users(){};

    public Users(String username, String email, String password, Fakultet fax) {
        this.username = username;
        this.email = email;
        this.password = password;
        faks = fax;

    }

    public Fakultet getFaks() {
        return faks;
    }

    public void setFaks(Fakultet faks) {
        this.faks = faks;
    }
//other getters and setters

}

我的 Komentari(评论)课程:

@Entity
@Table(name = "komentari")
public class Komentari {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Integer id;

    @Column(name = "Content")
    private String Content;

    @Column(name = "datum_kreiranja")
    private String creation_date;

    @ManyToOne(fetch = FetchType.LAZY, targetEntity = Tema.class, cascade = CascadeType.ALL)
    @JoinColumn(name = "id_teme", nullable = false)
    private Tema teme;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id_user")
    private Users users;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "id_parent", referencedColumnName = "id")
    private Komentari komentari;

    private Integer user_id;
    private Integer tema_id;
    @Column(name = "komentar_id")
    private Integer komentar_id;

    public Komentari() {
    }   
    public Tema getTeme() {
        return teme;
    }

    public void setTeme(Tema teme) {
        this.teme = teme;
    }

    public Users getUsers() {
        return users;
    }

    public void setUsers(Users users) {
        this.users = users;
    }

    public Komentari getKomentari() {
        return komentari;
    }

    public void setKomentari(Komentari komentari) {
        this.komentari = komentari;
    }

    public Integer getUser_id() {
        return user_id;
    }

    public void setUser_id(Integer user_id) {
        this.user_id = user_id;
    }
    
    public Integer getTema_id() {
        return tema_id;
    }

    public void setTema_id(Integer tema_id) {
        this.tema_id = tema_id;
    }

    public Integer getKomentar_id() {
        return komentar_id;
    }

    public void setKomentar_id(Integer komentar_id) {
        this.komentar_id = komentar_id;
    }
} //other getters and setters

数据库代码:

create table IF NOT EXISTS users (
                                     id INT AUTO_INCREMENT PRIMARY KEY,
                                     username varchar(255) not null ,
                                     email varchar(255),
                                     password varchar(255) not null,
                                     id_fakulteta int,
                                     enabled boolean
);
CREATE TABLE IF NOT EXISTS komentari (
                                         id INT NOT NULL AUTO_INCREMENT,
                                         id_teme INT NOT NULL,
                                         id_user INT NOT NULL,
                                         id_parent INT NULL,
                                         Content VARCHAR(280) NOT NULL,
                                         datum_kreiranja DATE NOT NULL,
                                         PRIMARY KEY (id),
                                         CONSTRAINT fk_komentari_teme
                                             FOREIGN KEY (id_teme)
                                                 REFERENCES teme (id_teme),
                                         FOREIGN KEY (id_parent)
                                             REFERENCES komentari(id)
                                             ON DELETE NO ACTION
                                             ON UPDATE NO ACTION,
                                         FOREIGN KEY (id_user)
                                             REFERENCES users(id)
                                             ON DELETE NO ACTION
                                             ON UPDATE NO ACTION
);

我的控制器:
@CrossOrigin(origins = "http://localhost:3000")
@PostMapping("/dodajKoment")
public ResponseEntity<?> makeKom(@RequestBody Komentari komentar) throws Exception {
    System.out.println(komentar);
    //komentar.getUsers() << IS NULL VALUE
    System.out.println(komentar.getUser_id() + " <<USERS ID");
    Optional<Users> us=use.findById(komentar.getUser_id());
    Optional<Tema> tem=this.temarep.findById(komentar.getTema_id());
    Optional<Komentari> kom=this.komentari.findById(komentar.getKomentar_id());
    komentar.setTeme(tem.get());
    komentar.setUsers(us.get());
    komentari.save(komentar);
    return ResponseEntity.ok("Success!");
}

在使用调试器时,我发现@RequestBody 获取的 komentar 没有设置映射对象,但它将 Komentari.java 中的 user_id 和 tema_id 字段设置为数据库列(id_tema,id_user)中的值。

添加了js代码:

import React, {Component} from 'react'
import axios from "axios";
import '../../style/login.css'


class CreatePost extends Component{
    constructor(props) {
        super(props);
        this.state = {
            tema:{
                id:'',
                naslov:'',
                datumKreiranja:Date().toLocaleString(),
                content:''
               },
            kol:{
                id:0,
                naziv:''
            },
            errors:{}
        };
        this.handleChange = this.handleChange.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);
    }

    componentDidMount() {
        this.getKolegij();
    }


    async getKolegij() {
        let id=this.props.location.state.id;
        const {errors} = this.state;
        axios.post('/kolegijid', id, {
            headers: {
                'Content-Type': 'application/json'
            }
        })
            .then(response => {
                console.log(response.data)
                this.setState(prevState => ({
                  kol: {
                       ...prevState.kol,
                           id: response.data.id,
                           naziv:response.data.naziv

                   }
               }))
            })
            .catch(error => {
                console.log(error.response)
                this.setState({
                    errors:{
                        ...errors,
                        succ: "Couldn't load categories",
                        style:{
                            fontSize: 13,
                            marginLeft: 14,
                            color: 'red'

                        }
                    }
                })
            });
    };


    handleChange(event) {
        const target = event.target;
        const value = target.value;
        const name = target.name;
        let tema = {...this.state.tema};
        tema[name] = value;
        this.setState({tema});
    }

    async handleSubmit(event) {
        let today=Date().toLocaleString();
        let polj=today.split(" ");
        let day=polj[1];
        let m=polj[2];
        let y=polj[3];
        let date=day+'-'+m+'-'+y;
        let id=this.props.location.state.id;
        event.preventDefault();
        console.log(this.state.tema.id);
        const {tema} = this.state;
        const { errors } = this.state;
        console.log(tema);
        axios.post('https://bbtstudyroom.ddns.net:8443/createtema', {
            id: this.state.tema.id,
            naslov: this.state.tema.naslov,
            datumKreiranja:date,
            idKolegij:this.state.kol.id,
            content:this.state.tema.content
        },
            {
            headers: {
                'Content-Type': 'application/json'
            }
        })
            .then(response => {
                console.log(response.data)
                this.setState({
                    errors:{
                        ...errors,
                        succ: "Success!",
                        style:{
                            fontSize: 13,
                            marginLeft: 14,
                            color: 'black'

                        }
                    }
                })
                setTimeout(function() {
                    let link="/dashboard/";
                    console.log(id);
                    window.location.href = link.concat(id);
                }, 2000);
            })
            .catch(error => {
                console.log(error.response)
                this.setState({
                    errors:{
                        ...errors,
                        succ: "Failed to create post!",
                        style:{
                            fontSize: 13,
                            marginLeft: 14,
                            color: 'red'

                        }
                    }
                })
            });

        this.setState({errors: {}}) ;
    }







    render() {
        let {tema} = this.state;
        return (
            <div className="container" id="cont">
                    <form onSubmit={this.handleSubmit}>
                        <h1>Create Post</h1>
                        <div className={'inp1'}>
                            <input id={'naslov'} type={"text"} name="naslov" value={tema.naslov} placeholder={"Header"} onChange={this.handleChange} />
                        </div >
                        <textarea id={'textc'} name="content" value={tema.content} placeholder={"Content"} onChange={this.handleChange}  rows="4" cols="50"/>
                        {this.state.errors.succ &&
                        <p style={this.state.errors.style}>{this.state.errors.succ}</p>}
                        <button type={'submit'} className={'btn1'}>Create Post</button>
                    </form>
                </div>


        );
    }}


export default CreatePost;

标签: javaspringrestspring-restcontrollerspring-rest

解决方案


推荐阅读