3

如何在 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.创建sender和acceptor两个通信器。

4.创建10条消息作为setSender(sender)和setAcceptor(acceptor)。

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

可能有点晚了,但为了区分这两个关系,您需要为 OneToMany 指定“反向”属性

@OneToMany(reverse = "methodDefiningTheRelationAtOtherClass")

注意:仅从 0.22.1 开始支持

另见:https ://developer.atlassian.com/display/DOCS/OneToMany+Relationship

...“将此设置为远程接口上相应 getter 的名称。如果不设置这些属性,活动对象将恢复为按类型推断方法。”

因此,如果 AO 按类型推断,它将采用它可以解析的第一个关系 - 对于同一个表的所有 OneToMany 注释,这将始终是相同的。

于 2014-02-04T08:21:29.610 回答