2016-03-23 6 views
2

Предположим, у нас есть обычная связь между родителями и дочерними элементами между двумя таблицами, employers и employees.Можно ввести UUIDs?

Поле employerId в employees действительно сравнима только id в employersemployerId в других таблицах). В интересах безопасности типов, я хотел бы представить employers в

class Employees(tag: Tag) extends Table[Employees](tag, "employees") { 
    def id = column[UUID[Employees]]("id") 
    def employerId = column[UUID[Employers]]("employerId") 
... 
} 

Сравнивая UUID[Employers] колонки к чему-либо другому, чем другому UUID[Employers] колонка, или с помощью любого сравнения, кроме равенства было бы бессмысленно (в большинстве схем, в том числе шахты), и я хотел бы зафиксировать этот факт во время компиляции.

Очевидно, что реальный UUID не принимает параметр типа, но эта потребность является общей. Это можно сделать?

+0

Что касается использования класса контейнера/оболочки, _e.g._ класс case, который содержит UUID внутри, но который для целей использования кода сам является идентификатором? Вы получите тип проверки, который вам нравится, но для использования скрытого/завернутого UUID вам потребуется сделать небольшую дополнительную работу с точки зрения доступа. – Castaglia

+0

@Castaglia - Я искал конкретный тип _existing_ или тип-библиотеку. См. [Мой ответ] (http://stackoverflow.com/a/36338795/238884) ниже. – Malvolio

ответ

1

Правильный ответ кажется Unicorn от Virtus Labs.

Эта библиотека добавляет инструменты для использования идентификаторов типов для ваших классов, поэтому вы не можете больше присоединяться к плохому полю id или испортить порядок полей в сопоставлениях. Он также предоставляет способ создания уровня доступа к данным с помощью методов (например, запрос всех, запрос по идентификатору, сохранение или удаление) для всех классов с такими идентификаторами всего за 4 строки кода.

Смежные вопросы