1

play-framework Web アプリケーションに投票機能を実装する際に問題が発生しています。

現在、私はこれらの変数をクラスで定義しており、投票の「スコア」が必要です。

@ManyToMany(cascade=CascadeType.REMOVE)
public List<User> upVotes = new ArrayList<User>();

@ManyToMany(cascade=CascadeType.REMOVE)
public List<User> downVotes = new ArrayList<User>();

同じクラスで、ユーザーが投票を切り替えることができるように、いくつかのメソッドも実装しました。

public void toggleUpVote(User user){
    if(user == null){
        // Do nothing
        Logger.debug("Vote: User is null!");
    }
    else if(upVotes.contains(user)){
        Logger.debug("Vote: removed upvote!");
        upVotes.remove(user);
        this.saveManyToManyAssociations("upVotes");
    } else {
        if(downVotes.contains(user)){
            Logger.debug("Vote: removed old downvote!");
            downVotes.remove(user);
            this.saveManyToManyAssociations("downVotes");
        }
        Logger.debug("Vote: Added upvote!");
        upVotes.add(user);
        this.saveManyToManyAssociations("upVotes");
    }
    Logger.debug("Uservotestatus: " + getVoteStatus(user));
    this.save();
}

public void toggleDownVote(User user){
    if(user == null){
        // Do nothing
        Logger.debug("Vote: User is null!");
    } else if(downVotes.contains(user)){
        Logger.debug("Vote: removed downvote!");
        downVotes.remove(user);
        this.saveManyToManyAssociations("downVotes");
    } else {
        if(upVotes.contains(user)){
            Logger.debug("Vote: removed old upvote!");
            upVotes.remove(user);
            this.saveManyToManyAssociations("upVotes");
        }
        Logger.debug("Vote: Added downvote!");
        downVotes.add(user);
        this.saveManyToManyAssociations("downVotes");
    }
    Logger.debug("Uservotestatus: " + getVoteStatus(user));
    this.save();
}

public int getVoteStatus(User user){
    if(upVotes.contains(user)){
        return 1;
    } else if (downVotes.contains(user)) {
        return -1;
    } else {
        return 0;
    }
}

public int getScore(){
    Logger.debug("upVotes: " + upVotes.size());
    Logger.debug("downVotes: " + downVotes.size());

    Logger.debug("upvotes: "+ upVotes + "downvotes:" + downVotes);
    return (upVotes.size() - downVotes.size());

ユーザーを upVotes リストに追加すると、downVotes リストにも追加されるようです。投票機能は問題なく動作しているようです。また、モデルをテストして、すべてが正常に動作することを確認しました。(テストは正常に機能し、問題は発生しません)テーブルが作成されているSQLファイルに忍び込み、次のManyToMany関係のみを見つけることができます:

create table note_user (
  note_id                        bigint not null,
  user_id                        varchar(255) not null,
  constraint pk_note_user primary key (note_id, user_id))
;

2 つのテーブルが作成されないのはなぜですか? 何らかの方法で多対多の関係に名前を付ける必要がありますか?

注釈でテーブルに名前を付ける方法を検索しようとしましたが、解決策が見つかりませんでした。

4

1 に答える 1

1

ジョイント可能なアノテーションを使用することで、この問題を解決できました。

@ManyToMany(cascade=CascadeType.REMOVE)
@JoinTable(name="up_votes")
public List<User> upVotes = new ArrayList<User>();

@ManyToMany(cascade=CascadeType.REMOVE)
@JoinTable(name="down_votes")
public List<User> downVotes = new ArrayList<User>();

データベースの結果は次のとおりです。

create table up_votes (
  note_id                        bigint not null,
  user_id                        varchar(255) not null,
  constraint pk_up_votes primary key (note_id, user_id))
;

create table down_votes (
  note_id                        bigint not null,
  user_id                        varchar(255) not null,
  constraint pk_down_votes primary key (note_id, user_id))
;
于 2013-10-18T02:00:40.747 に答える