[英]How to create two Ebean entities referring to each other at the same time?
I have one entity CheckpointAnswer.java: 我有一个实体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);
}
And Checkpoint.java: 还有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();
}
}
How can I create a Checkpoint
object having some CheckpointAnswer
objects? 如何创建一个
Checkpoint
有一些对象CheckpointAnswer
对象? A Checkpoint
cannot exist without CheckpointAnswer
and vice versa. 一个
Checkpoint
不能没有存在CheckpointAnswer
,反之亦然。
I tried the approach you can see in the code but the fails. 我尝试了可以在代码中看到的方法,但是失败了。 I have the following unit test:
我有以下单元测试:
@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);
}
The result: 结果:
[error] Test models.ModelsTest.createAndRetrieveCheckpoint failed: expected:<1> but was:<BeanList deferred >
Assuming assertEquals(1, checkpoints.get(0).possibleAnswers);
假设
assertEquals(1, checkpoints.get(0).possibleAnswers);
is failing, you probably want: 失败了,您可能想要:
assertEquals(1, checkpoints.get(0).possibleAnswers.size());
Also unrelated, you shouldn't have to save CheckpointAnswer
in your Checkpoint
constructor or in addPossibleAnswers
. 同样无关的,您不必将
CheckpointAnswer
保存在Checkpoint
构造函数或addPossibleAnswers
。 When you save Checkpoint
, your CheckpointAnswers
should get persisted. 保存
Checkpoint
, CheckpointAnswers
应该保持不变。 That's exactly why we use ORMs. 这就是我们使用ORM的原因。 Here's some info on cascades .
这是有关层叠的一些信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.