我正在我的应用程序上设置帐户激活和密码恢复。在这两种情况下,都会发送一封带有包含令牌的链接的电子邮件。
我需要确保在发送新令牌时先前的令牌无效。换句话说,通过电子邮件发送的新链接使以前的链接过时了。
我对所有类型的令牌使用同一张表。唯一性约束应位于二人组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]
那是因为我使用主键AND中的字段作为继承的区分符。我不知道为什么,但是似乎不允许这样做。
您能告诉我我该怎么做吗?
我正在使用liquibase手动创建数据库。
谢谢