【问题标题】:JPA mapping for one-to-many collection of shared data, with user specific values用于一对多共享数据集合的 JPA 映射,具有用户特定的值
【发布时间】:2020-01-09 11:14:11
【问题描述】:

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

@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;

@ElementCollection映射生成user_achievements表,atm只包含用户和成就外键

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

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

【问题讨论】:

  • @ElementCollection 只能与StringIntegerEnum等基本类型一起使用:docs.oracle.com/javaee/7/api/javax/persistence/…。您应该使用@...ToMany 关联。
  • 好点,但我可以在 targetclass 中传递我的对象并且它可以工作,只是由于级联是不好的做法吗?

标签: mysql hibernate spring-boot jpa spring-data-jpa


【解决方案1】:
@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

【讨论】:

  • 我已经有一个成就表,但列值将按照上述规范在用户之间共享。我正在寻找一种存储唯一值的方法,例如 boolean completed 应该存储在表 user_achievement 中
  • 所以,AFAIK,你必须使用@ManyToMany。我们需要user_achievement 表的详细信息
  • 我已经从用户模型中的@ElementCollection 创建了 user_achievements 表,但 atm 它只存储user_usernameachievements_achievement_id 作为外键。我希望在此表中存储更多值,但不确定如何在 JPA 中指定它
  • 谢谢 yuki,我决定采用与上述类似的解决方案。我试图避免创建 UserAchievement 模型,但似乎没有更直接的 JPA 解决方案。
猜你喜欢
  • 2011-06-12
  • 2012-12-08
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 2020-01-14
  • 1970-01-01
  • 2020-03-09
相关资源
最近更新 更多