dragos.pavel:
次のように私のシナリオがあります
ユーザーのリスト持つことができるトラックを、それに対応し、トラックのエンティティは、ユーザIDが含まれています。( @OneToMany
)
新しいトラックが作成されるたびに、トラックのリストが更新されます。
次のように前述の実体は、以下のとおりです。
トラックエンティティ
@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;
ユーザーエンティティ
@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
方法は以下の通りです
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
トラックエンティティの対応する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`))
dragos.pavel:
エンティティと問題との関係はまだ存続リファクタリング。:以下のようなトラックと、ユーザルックスとの関係のための小さなプレビューとしてトラックエンティティ
@Entity
@Table(name ="TRACK")
public class Track {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "TRACK_ID")
private Long trackId;
private String trackName;
@OneToMany(cascade = CascadeType.ALL,
orphanRemoval = true)
@JoinColumn(name = "POINT_ID")
private List<Point> point;
@OneToOne
@JoinColumn(name="TRACK_STATISTIC_ID")
private TrackStatistic trackStatistic;
private long numberOfLikes;
private Date creationTime;
ユーザエンティティ
@Entity
@Table(name = "USER")
public class User {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "USER_ID")
private Long userId;
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;
private boolean locked;
private long numberOfReports;
@JsonIgnore
@ManyToMany()
@JoinTable(name="FOLLOWER",
joinColumns={@JoinColumn(name="USER_ID")},
inverseJoinColumns={@JoinColumn(name="FOLLOWER_ID")})
private Set<User> followed = new HashSet<User>();
@JsonIgnore
@ManyToMany(mappedBy="followed")
private Set<User> follower = new HashSet<User>();
//How it was before
@OneToMany
@JoinColumn(name = "TRACK_ID")
private List<Track> tracks;
//How is it now
@OneToMany
@JoinColumn(name = "USER_ID")
private List<Track> tracks;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "SHARE_ID")
private List<Share> shares;
トラックが作成されたときに呼び出されるメソッドは次のようになります。
public Track createTrack(String username, TrackDTO trackDTO) {
Track track = modelMapper.map(trackDTO, Track.class);
Track newTrack = trackRepository.save(track);
return newTrack;
}
問題は、トラックリスト上の@JoinColumn注釈にあったので、私は名前をつけTRACK_IDをするのではなく、USER_ID