java - 在 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;
解决方案
推荐阅读
- python - 如何使用openpyxl在excel单元格中打印带有下标或上标的变量?
- python - 使用 .pb 文件使用张量流图
- spring - Spring Kafka 中的偏移量是如何提交的?
- select - 用于选择图层的 Photoshop 操作管理器代码,忽略图层 ID,错误?
- sql - 我们可以同时使用 Join、Case 和 where 子句吗
- amazon-web-services - 每当创建新资源而不使用 promethus 标记 AWS 云时创建警报
- postgresql - postgresql的`jsonb_set`中的`target`是什么意思?
- selenium - 如何使用 dockerfile 创建具有多个浏览器实例的 Selenium 网格
- angular - 角度应用程序中的“错误 FirebaseError:缺少或不足的权限”
- javascript - Angular 中的(输入)属性