2013-12-18 2 views
0

I가 하나의 엔티티 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 개체를 만들 수 있습니다은? CheckpointCheckpointAnswer없이 존재할 수 없으며 그 반대의 경우도 마찬가지입니다.

코드에서 볼 수있는 방법을 시도했지만 실패했습니다.

@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

@ 만세적 두 번째 것. – pmichna

답변

1

assertEquals(1, checkpoints.get(0).possibleAnswers);이 실패 가정하면, 당신은 아마 원하는 :

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

관련이없는, 당신은 저장이 안 나는 다음과 같은 단위 테스트가 Checkpoint 생성자에 CheckpointAnswer 또는 addPossibleAnswers에 있습니다. Checkpoint을 저장할 때 CheckpointAnswers이 지속되어야합니다. 그것이 바로 ORM을 사용하는 이유입니다. cascades에 대한 정보가 있습니다.

관련 문제