Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA和contains_Jpa - Fatal编程技术网

JPA和contains

JPA和contains,jpa,Jpa,我有一个生成了ID属性的普通JPA实体: @Entity(name = "AUTO_COMPLETION") public class AutoCompletion extends AbstractEntity { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "aip_seq") @SequenceGenerator(name = "aip_seq", sequenceName

我有一个生成了ID属性的普通JPA实体:

@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属性集一起写入数据库的值。我想通过函数再次检索它:

List<AutoCompletion> completions = autoCompletionService.getAutoCompletions()

但它总是返回false。。。我不明白为什么。这不应该是真的吗

我建议实现hashCode和equals

持久化时创建的对象和检索到的对象总是不相等的。是的,它们在逻辑上是相等的,因为它们属于数据库中的同一行,但它们是不同的对象引用,指向内存中的不同位置


有关详细信息,请参见javadoc。它使用类的equals方法进行比较。由于您尚未重写equals方法,这将默认obj1==obj2为operation,只有当它们指向内存中的同一位置时,才会返回true。

只有在同一事务中完成调用时,才会获得相同的实体实例。我想这不是您的情况,您正在调用服务类,并且您可能没有比服务更大的事务范围


正如其他人已经建议的那样,
equals()
需要实现一个
hashcode()
,以使
List#contains()
像您期望的那样工作。这可能会也可能不会对代码的其余部分产生影响,应该对其进行分析。

您是否实现了equals方法?否是其默认值。但是我想整个愤怒会小心的,你在使用哪个JPA提供商?您能看到该方法返回的列表实现是什么吗?
completions.contains(c2a1)