[英]How to create two Ebean entities referring to each other at the same time?
我有一个实体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("bob@gmail.com", "Bob", "secret", "000000000", USER_PRIVILEGE.regular).save();
Scenario scenario = Scenario.create("Scenario 1", false, null, "bob@gmail.com");
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的原因。 这是有关层叠的一些信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.