【问题标题】:Object mapping JPA/openEJB for database用于数据库的对象映射 JPA/openEJB
【发布时间】:2014-12-08 08:48:28
【问题描述】:

大家好,我正在尝试让我的课程持久保存到我的数据库中,但是我遇到了一个问题,我不知道如何解决。我正在尝试将 Score 的三个实例与我的用户映射,但我不确定如何让它工作。任何帮助表示赞赏。谢谢你:)

用户类 Snipit。

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

//I am not sure how to map the three fields below.
private Score highestScore; 
private Score averageScore; 
private Score lowestScore;

【问题讨论】:

  • 分数是否与普通数字不同?如果是这样,您应该进行映射-> onetone、manytone 等...
  • 是的,它包含每分钟的字数和错误
  • 这可能会有所帮助@OneToOne
  • 我知道这一点,但我不确定在这里使用什么类型的关系。我认为它是一对一的,但我不确定要映射什么领域。因为分数只有两个整数

标签: java mysql jakarta-ee jpa openejb


【解决方案1】:

虽然这里有一个公认的答案,但我没有看到建议的映射如何区分高分、低分和平均分?

您可以考虑使用如下图,其中分数表将有一个列“score_type”,该列可以映射到一个枚举“ScoreType”:

public class User{  

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

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

    @OneToMany
    @MapKeyColumn(name="score_type")
    @MapKeyEnumerated
    private Map<ScoreType, Score> scores; 

    public Score getHighScore(){
        return scores.get(ScoreType.HIGH);
    }

    public void setScore(Score score){
        score.setUser(this);
        scores.put(score.getType(), score);
    }
}

public class Score{

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;

    @Column(name = "type")
    @Enumerated(EnumType.String)//or ordinal
    private ScoreType type;
}

【讨论】:

    【解决方案2】:

    在我看来,用户有一个分数,而分数有一个用户。所以@OneToOne User 是拥有方并且是双向的。

    代码应该是这样的

    得分:

    @OneToOne(mappedBy = "score")
    private User user
    

    在用户中:

    @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
    @PrimaryKeyJoinColumn
    private Score highestScore;
    @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
    @PrimaryKeyJoinColumn
    private Score averageScore;
    @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
    @PrimaryKeyJoinColumn
    private Score lowestScore;
    

    【讨论】:

    • 声明它是由“score”映射的,但这不是相关类型的字段。
    • 检查一下它应该对你有帮助@OneToOne
    • 如何区分高、低、平均?
    【解决方案3】:

    如果分数与数据库无关,使用@Transient注解分数

    如果分数与数据库相关,请使用映射注释,例如 @OneToOne , @OneToMany (取决于您的数据库基数)

    编辑: 如果分数与数据库表相关,恕我直言,最简单的方法是让 IDE 自动为您从数据库生成实体 (但有时IDE会产生不想要的映射,所以还是需要检查一下)

    如果你使用 eclipse Generating entities from tables

    如果你使用 netbeans Adding Entity Classes

    但您仍然需要了解Multiplicity in Entity Relationships

    【讨论】:

    • 我希望表格有三列,所以它是一对一的......我不知道如何映射这个......
    • 必须有一个中间表不存在
    • @Devin,为什么需要中间表?除非存在 ManyToMany 关系,否则您可以只从 Snipit 引用 Score 表。
    • @iozee 因为该表中需要有 6 列。每个分数两列。三个分数。一对一委托似乎更好 -> x -> 一对多
    猜你喜欢
    • 1970-01-01
    • 2011-10-22
    • 2012-07-18
    • 2022-12-10
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    相关资源
    最近更新 更多