0

私は、レクリエーション バドミントン リーグ (ゲーム統計の登録と分析) の Web ポータルに取り組んでいます。バグ。

クエリですべてのチームを取得すると、アウェイ アウェイで行われたゲーム シリーズを含むはずのフィールドに、ホーム コートで行われたシリーズも含まれます。ただし、ホーム コートでプレーされるシリーズを含むフィールドには、アウェイ アウェイでプレーされるシリーズは含まれません (これは私が望む動作です)。

さらに、クエリを再度実行 (ページを更新) すると、家から離れてプレイしたゲーム シリーズを含むフィールドが拡大し始めます。クエリを実行するたびに、一連のホーム ゲームが再び awaySeries フィールドに登録されます。

例えば:

最初のクエリ:

チーム1

gameSeriesAway: Team1 vs Team2、Team1 vs Team3

gameSeriesHome: チーム 1 対 チーム 3

2 番目のクエリ:

チーム1

gameSeriesAway: Team1 vs Team2、Team1 vs Team3Team1 vs Team3

gameSeriesHome: チーム 1 対 チーム 3

チーム.java

@Entity
@NamedQueries({@NamedQuery(name = "Team.findAll", query="SELECT distinct t FROM Team t")})
public class Team implements Comparable<Team> {

    public static final String FIND_ALL_TEAMS = "Team.findAll";
    //Fields
    @Id
    private String name;
    private String description;

    //Relationships
    @OneToMany(mappedBy = "team")
    private List<Player> players;

    @ManyToMany
    private List<Division> divisionHistory;

    @OneToMany(mappedBy="homeTeam")
    private List<GameSeries> homeSeries;

    @OneToMany(mappedBy="awayTeam")
    private List<GameSeries> awaySeries;

    ...
    ...

    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Team)
            return name.equals(((Team) obj).name)? true:false;
        return false;
    }

    @Override
    public int hashCode() {
        return name.hashCode();
    }
}

ゲームシリーズ.java

@Entity
public class GameSeries {
    public static final int NUMBER_OF_GAMES = 5;

    // Fields
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @Column(nullable = false)
    private Timestamp playDate;

    // Relationships
    @OneToMany(mappedBy = "series")
    private List<Game> games;

    @ManyToOne
    private Division division;

    @ManyToOne
    private Team homeTeam;

    @ManyToOne
    private Team awayTeam;


    @Override
    public boolean equals(Object obj) {
        if (obj instanceof GameSeries)
            return playDate.equals(((GameSeries) obj).playDate)
                && homeTeam.equals(((GameSeries) obj).homeTeam)
                && awayTeam.equals(((GameSeries) obj).awayTeam) 
                ? true : false;
        return false;
    }

    @Override
    public int hashCode() {
       return  playDate.hashCode() + 2*homeTeam.hashCode() + awayTeam.hashCode();
    }
}

対応するテーブルは次のようになります。

ゲームシリーズ


idプリム

プレイ日

awayTeam_name MUL

Division_id MUL

homeTeam_name MUL


チーム


名前 プリム

説明


これは解決するのが非常に簡単な問題だと思いますが、JPA/EJB は初めてなので、これを理解することはできません。

4

1 に答える 1

0

コードを 1 行ずつデバッグしたところ、エラーが見つかったようです。

私の統計ユーティリティ クラスでは、awayGameSeries と homeGameSeries を 1 つのリストに結合しました。

List<GameSeries> allSeries = new ArrayList<GameSeries>(team.getAwaySeries());
allSeries.addAll(team.getHomeSeries());

... compute statistics for all game series

新しい ArrayList(argument)は元の awayGameSeries を「指す」ため、新しいリストにオブジェクトを追加すると、awayGameSeries も追加されます。(つまり、 addAll(team.getHomeSeries());という行が実行されると、homeGameSeries が awayGameSeries に追加されます)

これを解決するには、1 行のコードを追加するだけです。

List<GameSeries> allSeries = new ArrayList<GameSeries>();
allSeries.addAll(team.getAwayGameSeries());
allSeries.addAll(team.getHomeSeries());
于 2012-12-04T16:27:29.750 に答える