JPA-сопоставление для сбора общих данных «один-ко-многим» с заданными пользователем значениями c - PullRequest
0 голосов
/ 09 января 2020

У меня есть модель User, которая содержит список достижений

@Table(name = "user")
@Entity
@NamedEntityGraph(name = "User.achievements",
        attributeNodes={
                @NamedAttributeNode("achievements")
        })

@Data
public class User {
 @Id
    @NotNull
    @Column(name = "username")
    private String username;
    @Column(name = "password")
    private String password;

@ElementCollection(fetch = FetchType.LAZY, targetClass = Achievement.class)
private List<Achievement> achievements = new ArrayList<>();

}

Вот модель достижений

@Entity
@Data
@Table(name = "achievement")
public class Achievement {

@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
private String achievementId;

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

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

@Column(name = "achieved", columnDefinition="BOOLEAN DEFAULT false", nullable = false)
private boolean achieved = false;

user_achievements таблица, сгенерированная из отображения @ElementCollection, которое содержит только atm внешние ключи пользователя и достижения

enter image description here

Я хочу переместить значение boolean achieved в таблицу user_achievements, в идеале без необходимости создания отдельного модель User_Achievements

Я довольно новичок в использовании Jpa, но я чувствую, что этот сценарий слишком базовый c, поэтому должен быть прямой способ сделать это, я не могу его найти

1 Ответ

0 голосов
/ 09 января 2020
@Entity
class UserAchievement {

  @EmbeddableId
  UserAchievementId id;

  @ManyToOne(fetch=LAZY)
  @JoinColumn(name="user_username", insertable=false, updatable=false)
  User user;

  @ManyToOne(fetch=LAZY)
  @JoinColumn(name="achivement_achivement_id", insertable=false, updatable=false)
  Achivement achivement;

  // and other fields
}

class User {

  // ...

  @OneToMany(mappedBy="user")
  List<UserAchievement> userAchievements;
}

и вам нужно определить UserAchievementId

...