Я пытаюсь сохранить объекты с отношениями @OneToMany и @ManyToOne для этого db:
Вот сущности, которые были созданы мной:
Таблица аниме:
@Entity
@Table(name = "anime")
public class Anime {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Integer animeId;
@Column(name = "anime_name")
private String animeName;
@Column(name = "number_of_episodes")
private Integer numberOfEpisodes;
@Column(name = "general_rating")
private Double generalRating;
@Column(name = "number_of_votes")
private Integer numberOfVotes;
@OneToMany(mappedBy = "anime")
private Set<UserRating> userRatings = new HashSet<>();
//getters and setters
}
Таблица пользователей:
@Entity
@Table(name = "users")
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Integer userId;
@Column(name = "name")
private String name;
@Column(name = "password")
private String password;
@Column(name = "email")
private String email;
@OneToMany(mappedBy = "user")
private Set<UserRating> userRatings = new HashSet<>();
//getters and setters
}
И таблица рейтингов пользователей и встроенный идентификатор:
@Entity
@Table(name = "user_ratings")
public class UserRating {
@Embeddable
public static class UserRatingId implements Serializable{
@ManyToOne
@JoinColumn(name = "user_id")
protected Integer userId;
@ManyToOne
@JoinColumn(name = "anime_id")
protected Integer animeId;
public UserRatingId() {
}
public UserRatingId(Integer userId, Integer animeId) {
this.userId = userId;
this.animeId = animeId;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
UserRatingId that = (UserRatingId) o;
return Objects.equals(userId, that.userId) &&
Objects.equals(animeId, that.animeId);
}
@Override
public int hashCode() {
return Objects.hash(userId, animeId);
}
}
@EmbeddedId
private UserRatingId id;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
@ManyToOne
@JoinColumn(name = "anime_id")
private Anime anime;
@Column(name = "rating")
private Double rating;
//getters and setters
}
Итак, когда все эти сущности и отношения определены, как вы видите, я вижу исключение NullPointerException, которое говорит мне, что я испортил внешние ключи.
Root Cause
java.lang.NullPointerException
org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processFkSecondPassesInOrder(InFlightMetadataCollectorImpl.java:1749)
org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1658)
но я не могу понять, как исправить. Не могли бы вы взглянуть на это и помочь мне выяснить, где я напортачил, чтобы я мог это исправить? Спасибо.
Вы можете попробовать использовать производные удостоверения. Вы бы сопоставили свои объекты следующим образом:
@Entity
@Table(name = "user_ratings")
public class UserRating {
@Embeddable
public static class UserRatingId implements Serializable {
protected Integer userId; // type matches User's primary key
protected Integer animeId; // type matches Anime's primary key
//...
}
@EmbeddedId
private UserRatingId id;
@MapsId("userId") // maps userId attribute of embedded id
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
@MapsId("animeId") // maps animeId attribute of embedded id
@ManyToOne
@JoinColumn(name = "anime_id")
private Anime anime;
//...
}
Производные идентификаторы обсуждаются (с примерами) в Спецификация JPA 2.2 в разделе 2.4.1.
благодарю вас! это помогло мне