設想
我有一個具有復合主鍵的物體,如下所示。也是一個使用組合鍵exists和delete操作的存盤庫,如下所示。tokeId
@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. 相反,它期待一個StringID。下面是例外。
Parameter value element [com.abc.security.token.repository.sql.entity.TokenId@458c58e3] did not match expected type [java.lang.String (n/a)]
解決方法
如果我在存盤庫中單獨傳遞復合鍵的值,這似乎是有效的。但我想要一種直接使用復合鍵的方法。
非常感謝任何幫助。
附言
我還在SO 中發現了這個未回答的問題。
干杯。
uj5u.com熱心網友回復:
@Embeddable和@EmbeddedId注釋可以在這里達到目的。
首先,您可以使用類級別注釋來注釋您的TokenId類,@Embeddable如下所示:
@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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/490064.html
上一篇:按聚合的多對多列對物體進行排序
