2013-12-18 34 views
0

我有一個實體CheckpointAnswer.java:如何在同一時間創建兩個互相引用的Ebean實體?

@Entity 
public class CheckpointAnswer extends Model { 

    @Id 
    public Long id; 

    @Column(length=160,nullable=false) 
    public String answer; 

    @ManyToOne 
    public Checkpoint checkpoint; 

    public CheckpointAnswer(String answer, Checkpoint checkpoint) { 
     this.answer = answer; 
     this.checkpoint = checkpoint; 
    } 

    public static Model.Finder<Long, CheckpointAnswer> find = 
      new Finder<Long, CheckpointAnswer>(Long.class, CheckpointAnswer.class); 
} 

而且Checkpoint.java:

@Entity 
public class Checkpoint extends Model { 

     @Id 
     public Long id; 

     @Column(length=80,nullable=false) 
     public String name; 

     @Column(nullable=false) 
     public double longitude; 

     @Column(nullable=false) 
     public double latitude; 

     @Column(nullable=false) 
     public int points; 

     @Column(length=160,nullable=false) 
     public String message; 

     @OneToMany 
     public List<CheckpointAnswer> possibleAnswers = new ArrayList<CheckpointAnswer>(); 

     @ManyToOne 
     public Scenario scenario; 

     public Checkpoint(String name, double longitude, double latitude, int points, String message, List<String> answers, Scenario scenario) { 
       this.name = name; 
       this.longitude = longitude; 
       this.latitude = latitude; 
       this.points = points; 
       this.message = message; 
       this.scenario = scenario; 
       for(String answer: answers) { 
         CheckpointAnswer ca = new CheckpointAnswer(answer, this); 
         ca.save(); 
         possibleAnswers.add(ca); 
       } 
     } 

     public static Model.Finder<Long, Checkpoint> find = 
       new Finder<Long, Checkpoint>(Long.class, Checkpoint.class); 

     public void addPossibleAnswer(String answer) { 
       CheckpointAnswer checkpointAnswer = new CheckpointAnswer(answer, this); 
       checkpointAnswer.save(); 
       this.possibleAnswers.add(checkpointAnswer); 
       this.update(); 
     } 

     public static List<Checkpoint> findAssignedTo(Long scenario) { 
       return find.where() 
         .eq("scenario.id", scenario) 
         .findList(); 
     } 
} 

如何創建有一些CheckpointAnswer對象Checkpoint對象?如果沒有CheckpointAnswer,則Checkpoint不能存在,反之亦然。

我試過你可以在代碼中看到的方法,但失敗了。我有以下的單元測試:

@Test 
public void createAndRetrieveCheckpoint() { 
    new User("[email protected]", "Bob", "secret", "000000000", USER_PRIVILEGE.regular).save(); 
    Scenario scenario = Scenario.create("Scenario 1", false, null, "[email protected]"); 

    List<String> answers = new ArrayList<String>(); 
    answers.add("test answer 1"); 
    new Checkpoint("test checkpoint", 21.456, 10.2, 10, "Test question for the user", answers, scenario).save(); 
    List<Checkpoint> checkpoints = Checkpoint.find.all(); 
    assertNotNull(checkpoints); 
    assertEquals(1, checkpoints.size()); 
    assertNotNull(checkpoints.get(0).possibleAnswers); 
    assertEquals(1, checkpoints.get(0).possibleAnswers); 
} 

結果:

[error] Test models.ModelsTest.createAndRetrieveCheckpoint failed: expected:<1> but was:<BeanList deferred > 
+0

哪個測試失敗? assertEquals(1,checkpoints.size());''或'assertEquals(1,checkpoints.get(0).possibleAnswers);'? – mantithetical

+0

@mantithetical第二個。 – pmichna

回答

1

假設assertEquals(1, checkpoints.get(0).possibleAnswers);失敗,你可能想:

assertEquals(1, checkpoints.get(0).possibleAnswers.size()); 

而且不相關的,你不應該救CheckpointAnswer在您的Checkpoint構造函數或addPossibleAnswers中。當您節省Checkpoint時,您的CheckpointAnswers應該保留。這正是我們使用ORM的原因。以下是關於cascades的一些信息。

相關問題