如何在ActiveObjects中为同一个表写两个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.连接到localhost的mysql。
2.创建表模式。
3.创建发送者和接受者的两个传播者。
4.以setSender(发送者)和setAcceptor(接受者)的身份创建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();
}
}
}
谢谢。
答案 0 :(得分:1)
可能会有点晚,但为了区分这两个关系,你需要为OneToMany指定“反向”属性
@OneToMany(reverse = "methodDefiningTheRelationAtOtherClass")
注意:仅在0.22.1
之后才支持此功能另见:https://developer.atlassian.com/display/DOCS/OneToMany+Relationship
...“将此设置为远程接口上相应getter的名称。 如果未设置这些属性,Active Objects将恢复为按类型推断方法。“
因此,如果AO按类型推断,它将采用它可以解析的第一个关系 - 对于同一个表的所有OneToMany注释,这将始终是相同的。