如何在唯一性约束中使用单表继承的区分符?

时间:2019-03-27 15:48:34

标签: spring-boot spring-data-jpa single-table-inheritance liquibase-hibernate

我正在我的应用程序上设置帐户激活和密码恢复。在这两种情况下,都会发送一封带有包含令牌的链接的电子邮件。

我需要确保在发送新令牌时先前的令牌无效。换句话说,通过电子邮件发送的新链接使以前的链接过时了。

我对所有类型的令牌使用同一张表。唯一性约束应位于二人组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手动创建数据库。

谢谢

0 个答案:

没有答案