gpt4 book ai didi

java - 为什么当我尝试在数据库中插入新对象时出现错误?

转载 作者:行者123 更新时间:2023-11-30 05:19:24 26 4
gpt4 key购买 nike

我的场景如下

一个User可以有一个Track列表,与之对应,Track实体包含一个用户id。(@一对多)

每当创建新轨道时,轨道列表都会更新。

上述实体如下:

Track Entity

@Entity
@Table(name ="track")
public class Track {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long trackId;

@ManyToOne
@JoinColumn(name = "userId", nullable = false)
private User user;

@OneToOne(mappedBy = "track")
private Share share;

private String trackName;

@OneToMany(mappedBy = "pointId")
private List<Point> point;

@OneToOne(mappedBy = "track")
private TrackStatistic trackStatistic;

User Entity

@Entity
@Table(name = "user")
public class User {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name = "USER_ID")
private Long id;

private String firstName;

private String lastName;

@Column(unique = true)
private String username;

private String password;

@Column(unique = true)
private String email;

@Column(unique = true)
private String phoneNumber;

private int age;

private Role role;

@OneToMany(mappedBy = "shareId")
private List<Share> shares;

@OneToMany(mappedBy = "trackId")
private List<Track> tracks;

}

createTrack method is as follows

public Track createTrack(String username, TrackDTO trackDTO) {
//Find user
User user = userRepository.findByUsername(username);

//Convert Dto to Entity
Track track = modelMapper.map(trackDTO, Track.class);

//Update user track list
user.getTracks().add(track);

//Update track
track.setUser(user);

//save user
userRepository.save(user);

//save track
return trackRepository.save(track);
}

注意,TrackDTO是Track实体对应的Dto类

<小时/>

当我运行createTrack时,我遇到了以下错误:

2020-01-18 20:48:23.315 ERROR 14392 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper:
Cannot add or update a child row: a foreign key constraint fails (`thdb`.`track`, CONSTRAINT `FK5cftk3hw8vfnaigtj063skvxs` FOREIGN KEY (`track_id`) REFERENCES `user` (`user_id`))

2020-01-18 20:48:23.338 ERROR 14392 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]:
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement] with root cause

java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails
(`thdb`.`track`, CONSTRAINT `FK5cftk3hw8vfnaigtj063skvxs` FOREIGN KEY (`track_id`) REFERENCES `user` (`user_id`))

最佳答案

已编辑

<小时/>

通过主动级联,当您保存User时,无需再次保存Track。所以我对您的代码做了一些更改,如下所示,希望它有所帮助

1- Add cascade = CascadeType.ALL to User entity

2- Add targetEntity = Track .class, mappedBy = "user" to User entity

3- Add @ManyToOne(targetEntity = User.class) @JoinColumn(name = "USER_FK") to Track entity

4-Delete trackRepository.save(track);

5- Just save user(userRepository.save(user)). by cascade, it saves the track too.

6- Return the last track in user list.(Newest saved track)

<小时/>

我对上述编辑进行了编码,如下

User Entity

@Entity
@Table(name = "user")
public class User {

//other properties

@OneToMany(targetEntity = Track.class , mappedBy = "user" ,cascade = CascadeType.ALL)
private List<Track> tracks;

//getters and setters

}

Track Entity

@Entity
@Table(name ="track")
public class Track {

//other properties

@ManyToOne(targetEntity = User.class)
@JoinColumn(name = "USER_FK",nullable = false)
private User user;

//getters and setters

}

createTrack method

public Track createTrack(String username, TrackDTO trackDTO) {

//Find user
User user = userRepository.findByUsername(username);

//Convert Dto to Entity
Track track = modelMapper.map(trackDTO, Track.class);

//Update User and Track
user.getTracks().add(track);
track.setUser(user);

//save user
User result = userRepository.save(user);

//find saved track (you can fetch track by other ways too)
Track savedTrack = result.getTracks().get(result.getTracks().size()-1);

return savedTrack;
}

关于java - 为什么当我尝试在数据库中插入新对象时出现错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59803939/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com