3

ActiveObjectsの同じテーブルに2つのOneToManyリレーションを書き込むにはどうすればよいですか?このテストケースが失敗するのはなぜですか?

単純なメッセージエンティティ。

import net.java.ao.Entity;

public interface Message extends Entity{
    public void setSender(Communicator sender);
    public void setAcceptor(Communicator acceptor);
}

単純なコミュニケーター(人またはサーバー)。

import net.java.ao.Entity;
import net.java.ao.OneToMany;

public interface Communicator extends Entity {
    @OneToMany
    public Message[] getSendMessages();

    @OneToMany
    public Message[] getAcceptMessages();

}

テストケース。

1.ローカルホストのmysqlに接続します。

2.テーブルスキーマを作成します。

3.送信者と受信者の2つのコミュニケーターを作成します。

4. setSender(sender)およびsetAcceptor(acceptor)として10個のメッセージを作成します。

5.送信者が受け入れたメッセージの数を確認します。ゼロである必要があります。

6.しかし、junitはそれが10であると言いますが、ゼロではありません。

import java.sql.SQLException;

import junit.framework.TestCase;
import net.java.ao.EntityManager;

public class AOTest2 extends TestCase{
    public void test() {
        String db_host = "localhost";
        String db_database = "test";
        String db_login = "root";
        String db_password = "";

        EntityManager m = new EntityManager("jdbc:mysql://" + db_host + "/" + db_database, db_login, db_password);

        try {
            m.migrate(Communicator.class, Message.class);
        } catch (SQLException e1) {
            e1.printStackTrace();
        }

        try {
            Communicator sender = m.create(Communicator.class);
            Communicator acceptor = m.create(Communicator.class);
            sender.save();
            acceptor.save();
            for (int i = 0; i < 10; i++) {
                Message mes = m.create(Message.class);
                mes.setAcceptor(acceptor);
                mes.setSender(sender);
                mes.save();
            }

            assertEquals(true, sender.getAcceptMessages().length == 0);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

ありがとうございました。

4

1 に答える 1

1

少し遅いかもしれませんが、2 つの関係を区別するには、OneToMany に「reverse」属性を指定する必要があります

@OneToMany(reverse = "methodDefiningTheRelationAtOtherClass")

注: これは 0.22.1 以降でのみサポートされています

参照: https://developer.atlassian.com/display/DOCS/OneToMany+Relationship

... "これをリモート インターフェイスの対応するゲッターの名前に設定します。これらの属性を設定しない場合、アクティブ オブジェクトは型によるメソッドの推論に戻ります。"

したがって、AO が型によって推論する場合、解決できる最初のリレーションを取得します。これは、同じテーブルに対するすべての OneToMany アノテーションに対して常に同じになります。

于 2014-02-04T08:21:29.610 に答える