JPA并包含

时间:2015-10-12 12:50:08

标签: jpa

我有一个普通的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)

但它总是返回假...我不明白为什么。它不应该归还吗?

3 个答案:

答案 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像您期望的那样工作。这可能会或可能不会对您的其他代码产生影响,应该对其进行分析。