场景
我有一个具有复合主键的实体,如下所示。还有一个具有使用tokeId
复合密钥的exists
和delete
操作的存储库,如下所示。
@Entity
@IdClass(TokenId.class)
@NoArgsConstructor
@AllArgsConstructor
public class Token {
@Id
private String setId;
@Id
private String id;
@NotNull
private long expiration;
private boolean active;
private boolean setActive;
}
@Repository
public interface TokenRepositorySql extends JpaRepository<Token, TokenId> {
@Transactional
void deleteByIdIn(List<TokenId> id);
boolean existsByIdAndActiveTrueAndExpirationGreaterThan(TokenId tokenId, long currentTimestamp);
问题
在delete和exists函数中,hibernate都无法将Id
映射为TokenId
。相反,它需要一个String
id。以下是例外。
Parameter value element [com.abc.security.token.repository.sql.entity.TokenId@458c58e3] did not match expected type [java.lang.String (n/a)]
解决方案
如果我在存储库中单独传递复合键的值,这似乎是有效的。但是我想要一种直接使用复合键的方法。
非常感谢您的帮助。
p.S.
我在SO.中也发现了这个没有答案的问题
干杯。
@Embeddable
和@EmbeddedId
注释可以在此处实现此目的。
首先,您可以使用@Embeddable
类级别的注释来注释TokenId
类,如下所示:
@Embeddable
public class TokenId {
@Column(name="field1")
private String field1;
@Column(name="field2")
private String field2;
}
然后使用上面的Embeddable类作为父类中的embeddedId,如下所示:
@Entity
@NoArgsConstructor
@AllArgsConstructor
public class Token {
@EmbeddedId
private TokenId id;
@NotNull
private long expiration;
private boolean active;
private boolean setActive;
}