如何创建两个同时引用的Ebean实体?

时间:2013-12-18 09:48:54

标签: java orm playframework ebean playframework-2.2

我有一个实体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();
        }
}

如何创建包含CheckpointCheckpointAnswer个对象的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 >

结果:

{{1}}

1 个答案:

答案 0 :(得分:1)

假设assertEquals(1, checkpoints.get(0).possibleAnswers);失败,您可能需要:

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

同样无关,您不必在CheckpointAnswer构造函数或Checkpoint中保存addPossibleAnswers。保存Checkpoint后,您的CheckpointAnswers应该保留。这正是我们使用ORM的原因。以下是cascades的一些信息。