Я настраиваю активацию учетной записи и восстановление пароля в моем приложении.В обоих случаях электронное письмо отправляется со ссылкой, содержащей токен.
Мне нужно убедиться, что предыдущие токены становятся недействительными при отправке нового.Другими словами, новая ссылка, отправленная по электронной почте, делает предыдущую ссылку устаревшей.
Я использую одну и ту же таблицу для всех типов токенов.Ограничение уникальности должно быть на дуэте email-tokenType.
Поэтому я попытался использовать стратегию наследования SINGLE_TABLE, например:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TOKEN_TYPE")
public abstract class UserToken {
@EmbeddedId
private UserTokenIdentity userTokenIdentity;
private String token;
}
@Embeddable
public class UserTokenIdentity {
private String email;
private String tokenType;
}
@Entity
@DiscriminatorValue("A")
public class ActivationToken extends UserToken {
}
@Entity
@DiscriminatorValue("P")
public class ResetPasswordToken extends UserToken {
}
Проблема в том, что я не могу этого сделать из-заследующая ошибка:
Caused by: org.hibernate.DuplicateMappingException: Table [user_token] contains physical column name [token_type] referred to by multiple physical column names: [tokenType], [TOKEN_TYPE]
Это потому, что я использовал поле в первичном ключе И как дискриминатор для наследования.Я не знаю почему, но это, кажется, недопустимо.
Не могли бы вы высказать свое мнение о том, как мне это сделать?
Я использую liquibase для создания базы данных вручную.
Спасибо