1 回答
TA贡献1773条经验 获得超3个赞
我建议你另一种方法。代表团。
你为什么不直接实现接口并接受另一个实例作为构造函数参数,而不是扩展? HashMap<K, V>Map<K, V>Map
class ScoreMap<T> implements Map<T, Double> {
private final Map<T, Double> delegate;
ScoreMap(final Map<T, Double> delegate) {
this.delegate = delegate;
}
...
@Override
public Double get(final Object key) {
// Apply custom logic, if needed
return delegate.get(key);
}
// And so on...
}
然后,使用 agetter和 asetter
@Entity
@...
class YourEntity {
...
private Map<String, Double> keywords;
@ElementCollection(fetch = FetchType.EAGER)
public ScoreMap<String> getKeywords() {
// This is fine as we know the Map will always be a ScoreMap
return (ScoreMap<String>) keywords;
}
public void setKeywords(final Map<String, Double> keywords) {
this.keywords = new ScoreMap<>(keywords);
}
}
正如您所看到的,每次 Hibernate设置时Map,您都会将其包装在您的ScoreMap中,并具有额外的自定义逻辑。
为了您的兴趣,HibernatePersistentMap确实实现了该Map接口,因此您的ScoreMap.
休眠文档状态
作为要求,必须将持久集合值字段声明为接口类型(参见示例 7.2,“使用 @OneToMany 和 @JoinColumn 的集合映射”)。实际的接口可能是 java.util.Set、java.util.Collection、java.util.List、java.util.Map、java.util.SortedSet、java.util.SortedMap 或任何你喜欢的东西(“任何你喜欢的东西”意味着您必须编写 org.hibernate.usertype.UserCollectionType 的实现)。
所以我将编辑我上面的例子。
作为最后的手段,你可以看看UserCollectionType
添加回答
举报