我有一个普通的JPA实体,其中生成了ID-Attribute:
@Entity(name = "AUTO_COMPLETION")
public class AutoCompletion extends AbstractEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "aip_seq")
@SequenceGenerator(name = "aip_seq", sequenceName = "aip_seq", allocationSize = 1)
@Column(name = "ID")
private Long id;
...
}
我创建了一个JPA实体:
AutoCompletion c2a1 = new AutoCompletion();
c2a1.setClient(c2);
c2a1.setText("c2a1");
c2a1.setType(AutoCompletionType.PERSON);
autoCompletionService.create(c1a1);
Create实现如下:
@Override
public T create(final T t) {
this.em.persist(t);
return t;
}
现在,实体将与ID-Attribute集一起写入数据库。我想通过函数再次检索它:
List<AutoCompletion> completions = autoCompletionService.getAutoCompletions()
我以为我可以致电
completions.contains(c2a1)
但它总是返回假...我不明白为什么。它不应该归还吗?
答案 0 :(得分:0)
我建议实现hashCode和equals
答案 1 :(得分:0)
持久化时创建的对象和检索到的对象始终不相等。是的,它们在逻辑上是相同的,因为它们属于数据库中的同一行,但它们是不同的对象引用并指向内存中的不同位置。
请参阅List.contains的javadoc。它使用你的类的equals方法进行比较。由于您没有覆盖equals方法,因此默认obj1 == obj2为operation,只有当它们指向内存中的相同位置时才会返回true。
答案 2 :(得分:0)
只有在同一事务中完成调用时,才能获得相同的实体实例。我想这不是你的情况,你正在调用服务类,你可能没有比服务更大的事务范围。
正如其他人已经建议的那样,equals()
hashcode()
需要实施List#contains()
才能使where Date > '01JUL2006'd
像您期望的那样工作。这可能会或可能不会对您的其他代码产生影响,应该对其进行分析。