ebean однонаправленное отношение @OneToOne с уникальным ограничением


У меня есть класс пользователя:

@Entity
public class User extends Model {

@Id
public Long id;
public String email;
public String name;
public String password;
}

И класс водителя

@Entity
public class Driver extends Model {
@Id
public Long id;

@OneToOne (cascade = CascadeType.ALL)
@Column(unique = true)
public User user;
}

Я хочу убедиться, что идентификатор пользователя уникален внутри таблицы драйверов. Но приведенный выше кодекс этого не требует. (Я могу создать несколько драйверов с одним и тем же идентификатором пользователя).

В идеале я не хочу добавлять отношения @OneToOne в пользовательский класс, потому что в моем приложении есть несколько различных ролей (например, водитель, учитель, агент и т. д.) и я не хочу загрязнять класс пользователя всеми этими отношения.

Как я могу этого достичь?

1 4

1 ответ:

Я попробовал этот код на модели для меня, и он сработал. Следует отметить, что вы должны использовать аннотацию @OneToOne, чтобы ORM знал, что у вас есть ссылка на внешний ключ к другой модели.

Модель выглядит следующим образом:

@Entity
// add unique constraint to user_id column
@Table(name = "driver", 
       uniqueConstraints = @UniqueConstraint(columnNames = "user_id")
)
public class Driver extends Model {
   @Id
   public Long id;

   @OneToOne
   @JoinColumn(name = "user_id")
   public User user;
}

Он будет генерировать сценарий эволюции, как это :

create table driver (
   id            bigint not null,
   user_id       bigint,

   constraint uq_driver_1 unique (user_id), # unique database constraint
   constraint pk_driver primary key (id)
);
Таким образом, с помощью этого метода вы можете убедиться, что у вас будет уникальная ссылка user на таблицу driver.

Дополнительная Информация

Потому что там является дополнительным ограничением, которое обрабатывается не фреймворком, а базой данных, применяемой к модели (, такой как unique ограничение ), чтобы проверить ввод или обработку возникшего исключения, можно окружить выражение Model.save() или form.get().save() (saving-the-model) блоком try-catch для обработки PersistenceException.