Relationship Pair

We can think of a @OneToOne/@OneToOne relationship pair as the same as a @OneToMany/@ManyToOne relationship pair but with the addition that the "many" side has a cardinality of "at most 1".

From a Relational database perspective the @OneToOne relationship pair is like the @OneToMany/@ManyToOne pair but with the addition of a unique constraint which effectively limits the cardinality of the "many" side to be "at most 1".

From the perspective of Ebean internals. The @OneToOne(mappedBy=) acts much like the @OneToMany(mappedBy=) [the "many" side] and the other @OneToOne acts like the @ManyToOne [the "one" side].

@OneToOne "many" side

The "many" side @OneToOne has the mappedBy attribute (like @OneToMany).

@Entity
public class Wheel ...

  // has "mappedBy" (like @OneToMany)
  // ... so we can think of this as the "many" side
  // ... with cardinality limited to "at most 1"
  @OneToOne(mappedBy = "wheel")
  Tire tire;
  ...

@OneToOne "one" side

The "one" side @OneToOne has no mappedBy attribute. This side acts almost exactly like @ManyToOne.

This side maps to the foreign key column. If the foreign key column does not match the naming convention we can specify a @JoinColumn.

@Entity
public class Tire ...

  // no mappedBy (like @OneToMany)
  // ... so the "one" side of the relationship
  // ... means it maps to the foreign key
  // ... use @JoinColumn if needed
  @OneToOne
  @JoinColumn(name = "wheel")
  Wheel wheel;