首页 > 解决方案 > 用于一对多共享数据集合的 JPA 映射,具有用户特定的值

问题描述

我有一个包含成就列表的用户模型

@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 仅包含用户和成就外键

在此处输入图像描述

我希望将boolean achieved值移动到user_achievements表中,理想情况下无需创建单独的模型 User_Achievements

我对使用 Jpa 很陌生,但我觉得这种情况太基础了,所以必须有一种直接的方法来做,我似乎无法找到它

标签: mysqlhibernatespring-bootjpaspring-data-jpa

解决方案


@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


推荐阅读