2012-04-08 10 views
3

ActiveObjectsの同じテーブルに2つのOneToMany関係を書き込むにはどうすればよいですか? なぜこのテストケースが失敗するのですか?ActiveObjectsの同じテーブルに2つの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.送信者と受信者の2つのコミュニケータを作成します。

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

[この質問の重複](http://stackoverflow.com/questions/669828/how-to-have-2-collections-of-the-same-type-in​​-jpa) – nobeh

+0

ao does not have @JoinTable注釈。 http://activeobjects.java.net/0.8.2/api/net/java/ao/package-summary.html – KenichiYamamoto

+0

@nobeh JPAとActiveObjectsは類似していますが、2つの異なるORMです。 –

答えて

1

少し遅れて、しかし、あなたが指定する必要がある2つの関係を区別するために「逆」OneToMany

@OneToMany(reverse = "methodDefiningTheRelationAtOtherClass") 

注属性されることがあります。これは、0.22.1

ので、サポートされています参照:https://developer.atlassian.com/display/DOCS/OneToMany+Relationship

...「リモートインタフェース上の対応するゲッターの名前に設定し あなたはこれらの属性を設定しない場合は、アクティブなオブジェクトに。タイプ別にメソッドを推論するようになります。

したがって、AOがタイプによって推論すると、解決できる最初のリレーションが取られます。これは、同じテーブルに対するすべてのOneToMany注釈に対して常に同じです。

関連する問題