2012-04-08 15 views
3

Wie kann ich zwei OneToMany-Beziehung zu derselben Tabelle in ActiveObjects schreiben? Warum dieser Testfall fehlschlägt?Wie zwei OneToMany-Beziehung zu derselben Tabelle in ActiveObjects schreiben

einfache Nachricht entity.

import net.java.ao.Entity; 

public interface Message extends Entity{ 
    public void setSender(Communicator sender); 
    public void setAcceptor(Communicator acceptor); 
} 

einfacher Kommunikator (Person oder Server).

import net.java.ao.Entity; 
import net.java.ao.OneToMany; 

public interface Communicator extends Entity { 
    @OneToMany 
    public Message[] getSendMessages(); 

    @OneToMany 
    public Message[] getAcceptMessages(); 

} 

Testfall.

1. Verbindung zu mysql von localhost.

2. Tabellenschemata erstellen.

3.Erstellen Sie zwei Kommunikatoren von Sender und Akzeptor.

4. Erstellen Sie 10 Nachrichten als setSender (Sender) und setAcceptor (Akzeptor).

5. Überprüfen Sie die Anzahl der Nachrichten, die der Absender akzeptiert hat. es sollte Null sein.

6. aber Junit sagt, es ist 10, aber nicht Null.

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

Danke.

+0

Duplizieren von [diese Frage] (http://stackoverflow.com/questions/669828/how-to-have-2-collections-of-the-same-type-in-jpa) – nobeh

+0

ao muß nicht @JoinTable Anmerkung. http://activeobjects.java.net/0.8.2/api/net/java/ao/package-summary.html – KenichiYamamoto

+0

@nobeh JPA und ActiveObjects, obwohl ähnlich, sind zwei verschiedene ORMs. –

Antwort

1

vielleicht ein bisschen spät, aber, um die beiden Beziehungen Sie angeben müssen, zu unterscheiden, die „reverse“ Attribut für OneToMany

@OneToMany(reverse = "methodDefiningTheRelationAtOtherClass") 

Hinweis: Dies ist erst seit 0.22.1 unterstützt

siehe auch: https://developer.atlassian.com/display/DOCS/OneToMany+Relationship

... „setzen Sie dies auf den Namen des entsprechenden Getter auf der Remote-Schnittstelle Wenn Sie nicht diese Attribute gesetzt, Aktiv Objekte. wird wieder auf die Methode nach Typ schließen. " So

, wenn AO inferrs nach Typ, wird es die erste Beziehung nimmt es lösen - und dies wird das gleiche für alle Ihre OneToMany Anmerkungen zu der gleichen Tabelle immer sein.