2017-02-18 2 views
0

У меня есть несколько типов, которые имеют общее поле (идентификатор электронной почты), который я использую как @Id. Эти типы распространяются от обычного пользователя, у которого есть поле «Идентификатор электронной почты». Это то, как показано ниже:Задайте вопрос: как я могу получить уникальный идентификатор для нескольких типов?

@Entity 
class User{ 
    @Id 
    String emailID; 
} 

@Entity 
@Subclass(index = true) 
class UserType1 extends User{ 

    String otherField; 
} 


@Entity 
@Subclass(index = true) 
class UserType2 extends User{ 

    String otherField; 
} 

Теперь я хочу, чтобы каждый раз, когда я ввожу подтип пользователя, идентификатор электронной почты должен оставаться уникальным во всех этих подтипов объектов в хранилище данных. Я тестировал конечную точку для вышеуказанных типов, вставляя каждый из подтипов с тем же идентификатором EmailID, и это произошло успешно. Objectify не должен допускать сохранение подтипов с одинаковым идентификатором. По моему пониманию, конечная уникальность обеспечивается ключами, но я не могу обеспечить уникальность идентификатором только подтипов, особенно когда идентификатор находится в базовом классе? Есть ли способ сделать это?

EDIT: Хотя, это не решение, которое я искал, я справилась с этой ситуацией, создав новый тип объекта с {EMAILID, Key_Subtype}, который работал в обеспечении уникальности. Я просто проверяю этот объект на существующий адрес электронной почты, и я использую ключ для извлечения объекта другим запросом.

Если у кого-то отличное решение, я был бы признателен.

ответ

1

UUID - это то, что вы ищете. Он создается для каждого объекта. Тип не имеет значения.

https://dzone.com/articles/hibernate-and-uuid-identifiers

+0

С Objectify проблема заключается в том, что мне нужно будет выполнить запрос для каждого подтипа. У меня есть идентификатор электронной почты уже как уникальный идентификатор, поэтому я не требую UUID для каждого типа.Я просто хочу, чтобы запросить все подтипы в 1 запросе, чтобы узнать, является ли свойство идентификатора электронной почты уникальным для нового пользователя. –

+0

Хорошо. Теперь я понимаю. Итак, может быть, просто перечисление с пользовательскими типами? – MicD

0

же Id для различных типов объектов, безусловно, возможно на уровне хранилища данных, см re-using an entity's ID for other entities of different kinds - sane idea?

Id уникальности гарантируются только через субъект те же родов и с той же материнской компанией (уникальный ключ объекта основан на сочетании этих 3 элементов). Так как ваши подтипы на самом деле разные виды сущностей, нет проблем с тем же Id в этих типах, поэтому подкласс не является способом достижения желаемого.

Чтобы иметь уникальный Id, вам необходимо иметь уникальный вид сущности, скажем User. Чтобы различать разные типы пользователей, возможно, есть внутри User a type свойство, которое будет ссылкой на объект вида UserTypeX, содержащий информацию, относящуюся к этому типу пользователя?

0

Похоже, вы нашли правильное решение - создайте объект Email, который использует адрес электронной почты в качестве идентификатора и содержит указатель на соответствующий объект User. При создании нового User/Email всегда проверяйте наличие существующего адреса электронной почты в транзакции.

Это действительно ничем не отличается от использования адреса электронной почты как идентификатора User, за исключением того, что дополнительный слой косвенности позволяет пользователям изменять свои адреса электронной почты, что обычно является хорошей идеей. Транзакционная логика аналогична в любом случае.

Транзакционно поиск & создание сущности с натуральным первичным ключом - это в значительной степени единственный способ гарантировать уникальность в хранилище данных. Он эффективен и масштабируемо.

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