Как написать два отношения OneToMany для одной таблицы в ActiveObjects

Как я могу написать два отношения OneToMany для одной и той же таблицы в ActiveObjects? Почему этот тест не проходит?

простая сущность сообщения.

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 localhost.

2. создать таблицы схем.

3.создать два коммуникатора отправителя и получателя.

4. создать 10 сообщений как setSender(отправитель) и setAcceptor(акцептор).

5. проверьте количество сообщений, которые принял отправитель. это должно быть ноль.

6.но джунит говорит, что это 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();
        }
    }
}

Спасибо.

1 ответ

Может быть, немного поздно, но чтобы различать эти два отношения, вам нужно указать атрибут "reverse" для OneToMany

@OneToMany(reverse = "methodDefiningTheRelationAtOtherClass")

Примечание: это поддерживается только с 0.22.1

см. также: https://developer.atlassian.com/display/DOCS/OneToMany+Relationship

... "Установите это в качестве имени соответствующего получателя на удаленном интерфейсе. Если вы не установите эти атрибуты, активные объекты вернутся к выводу метода по типу."

Таким образом, если AO выводит по типу, он примет первое отношение, которое может разрешить - и это всегда будет одним и тем же для всех ваших аннотаций OneToMany к одной и той же таблице.

Другие вопросы по тегам