我有这个实体POJO,它具有用于hashcode和equals的 item 和 location 属性。
List<POJO> pojos = pojoRepository.findAll();
然后我创建一个查找POJO对象,
POJO pojo = new POJO(item, location);
但是当我尝试执行pojos.contains(pojo)
时,它返回false。
所以我在pojo equals
方法中添加了一个调试信息。
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass()) {
System.err.println("xxxxxxxxxx");
System.err.println(getClass());
System.err.println(obj.getClass());
System.err.println("xxxxxxxxxx");
return false;
}
输出返回
xxxxxxxxxx
class com.demo.entity.Pojo
class com.demo.entity.Pojo_$$_jvst83f_19
xxxxxxxxxx
如何使它平等?我也试过obj instanceof Pojo
但仍然返回false。
答案 0 :(得分:1)
这是因为hibernate在内部创建了Pojo
类。什么查询返回代理模仿实体类型的实例。这就是为什么它不是_jvst83f_19
而是内部代理类getClass().inInstance(obj)
跳过类比较并仅比较属性。
您也可以尝试这样的事情:
@Configuration
public class NewConfiguration {
@Primary
@Bean
public InterfaceType overrideBean() {
return new InterfaceTypeImpl();
}
}