Как написать два отношения 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 к одной и той же таблице.