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 ответ:
Я попробовал этот код на модели для меня, и он сработал. Следует отметить, что вы должны использовать аннотацию
@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.