如何在ActiveObjects中将两个OneToMany关系写入同一个表

时间:2012-04-08 01:22:23

标签: java rdbms one-to-many rdb active-objects

如何在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();
        }
    }
}

谢谢。

1 个答案:

答案 0 :(得分:1)

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

@OneToMany(reverse = "methodDefiningTheRelationAtOtherClass")

注意:仅在0.22.1

之后才支持此功能

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

  

...“将此设置为远程接口上相应getter的名称。   如果未设置这些属性,Active Objects将恢复为按类型推断方法。“

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