【问题标题】:How do I create 2 separate instances on an inner class as separate properties of the outer class which is a JPA entity?如何在内部类上创建 2 个单独的实例作为 JPA 实体的外部类的单独属性?
【发布时间】:2022-01-12 14:20:39
【问题描述】:

我有一个名为 User 的类,在这个类中它们以前具有以下属性:

@Entity(name = "User")
@Table(name = "user")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "username", unique = true)
    private String username;

    @Column(name = "password")
    private String password;
    
    private Integer victories;
    private Integer defeats;

    private Double victoryRatio;
}

但是,我现在需要区分不同的游戏类型,例如,有竞技游戏和非竞技游戏。

这意味着每次进行比赛或非比赛时,标准的胜利、失败和胜利比率都必须更新。但是,当玩比赛时,我还需要增加新的“比赛”变量,如下所示:

@Entity(name = "User")
@Table(name = "user")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "username", unique = true)
    private String username;

    @Column(name = "password")
    private String password;
    
    private Integer victories;
    private Integer defeats;

    private Double victoryRatio;

    private Integer compVictories;
    private Integer compDefeats;        
    private Double compVictoryRatio;
}

这会导致其他类(例如服务类)中出现大量代码重复。我想创建一个名为 UserStats 的新类:

public class UserStats {
   
    private Integer victories;
    private Integer defeats;
    
    private Double victoryRatio;

}

然后在原来的User实体内拥有:

private UserStats userStats;
private UserStats compUserStats;

但不幸的是,这不起作用,IDEA 在上面的代码中以红色突出显示了“UserStats”。

我是否需要将 UserStats 创建为单独的实体,然后执行以下操作:

@OneToMany
private UserStats userStats;

@OneToMany
private UserStats compUserStats;

我不确定如何以最好的方式做到这一点,任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 您在这里使用@OneToMany 有什么原因吗?为什么单个用户会有许多不同的竞争胜率?
  • 他们不会,但他们会有许多不同的 UserStats,1 个用于竞技游戏,1 个用于非竞争游戏?
  • 那么这不是带有 userStats 的 @OneToOne 和带有 compuUserStats 的 @OneToOne 吗?它不能解决您的 UserStats 红色下划线 - 我建议您将 UserStats 创建为您所说的实体并导入 UserStats 来解决该问题。

标签: java spring spring-boot oop spring-mvc


【解决方案1】:

然后在原来的User实体内拥有:

private UserStats userStats;
private UserStats compUserStats;

这在 Java 中看起来是可行的。 IDE 的错误信息是什么?它很可能无法映射到 JPA 实体。在您的 UserStats 类中,您是否正确定义了这一点?您的数据库是否有用于此的表 a? https://www.baeldung.com/jpa-entities

【讨论】:

  • IDE 没有说明为什么它是红色的,它只是说“检查 jpa”,但不,我没有将 UserStats 类定义为 JPA 实体,我应该这样做吗?谢谢。
  • 当我刚刚尝试这个时,红线显示“标记为多对一或单对一关系”
  • 但是不能一对一吧?由于每个用户将在 2 个 UserStats 内,还是仍然是一对一的,因为每个 UserStats 中只有一个用户?谢谢。
  • 听起来你想要一个一对多的关系(用户->用户统计)。虽然有这个。您将需要在您的或 UserStats 表或连接表上使用 UserId。给 JPA 一些可以映射的东西。 stackoverflow.com/questions/5478328/…
  • 另外,您可能必须在表上有一列来定义它是哪种类型的 UserStat。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多