我有一个实体CheckpointAnswer.java:
@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();
}
}
如何创建具有某些
Checkpoint
对象的CheckpointAnswer
对象?没有Checkpoint
的CheckpointAnswer
不能存在,反之亦然。我尝试了可以在代码中看到的方法,但是失败了。我有以下单元测试:
@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 >
最佳答案
假设assertEquals(1, checkpoints.get(0).possibleAnswers);
失败了,您可能想要:
assertEquals(1, checkpoints.get(0).possibleAnswers.size());
同样无关的,您不必将
CheckpointAnswer
保存在Checkpoint
构造函数或addPossibleAnswers
中。保存Checkpoint
时,您的CheckpointAnswers
应该保持不变。这就是我们使用ORM的原因。以下是有关cascades的信息。