当前位置: 首页 > 知识库问答 >
问题:

如果我将一个实体对象与另一个具有集合元素的已获取对象(尽管它们应该相等)相结合,为什么实体对象不相等?

严修诚
2023-03-14

我有3个实体类,它们彼此之间有关系

TestClassParent:

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(of = "email")
@Inheritance(strategy = InheritanceType.JOINED)
public class TestClassParent {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String email;
}

TestClassChild:

@Entity
@Data
@EqualsAndHashCode(callSuper = true)
public class TestClassChild extends TestClassParent{

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "test_collection_id")
    private TestChildCollection testChildCollection;
}

TestChildCollection:

@Entity
@Data
@EqualsAndHashCode(of ="id")
@AllArgsConstructor
@NoArgsConstructor
public class TestChildCollection {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @OneToMany(mappedBy = "testChildCollection",cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    private Set<TestClassChild> testClassChildSet;
}

当前我的数据库如下所示:

关系:

通过比较对象的电子邮件来实现对象的均衡

我有测试这个案例的代码:

@SpringBootApplication
@AllArgsConstructor
public class DemoApplication {
    private final TestClassChildRepository testClassRepository;
    private final TestChildCollectionRepository testChildCollectionRepository;

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
    @Bean
    public ApplicationRunner applicationRunner() {
        return args -> {
            TestClassChild testClassChild = testClassRepository.findById(1L).get();
            TestClassChild testClass1 = new TestClassChild();
            testClass1.setId(testClassChild.getId());
            testClass1.setEmail(new String("newTestEmail2"));
            System.out.println(testClass1.equals(testClassChild));
        };
    }

}

我对这些物体的比较结果是错误的

我找了调试,发现第一个实例在电子邮件中有hashcode,另一个实例没有第一个:

第二个:

共有1个答案

司马高昂
2023-03-14

testClassRepository.findById(1L). get();返回一个对象与testChildCollection.当您生成一个新的TestClasschild时,您设置了id和电子邮件,但没有设置集合,但在您的示例中,Lombok还使用testChildCollection来计算equals/hashCode。

当使用继承时,我通常会尽量避免使用@Data,因为它很容易失去对equals/hashCode实际生成方式的跟踪。

@Entity
@Getter
@Setter
@ToString(callSuper = true) // Only if you really need a toString implementation that also prints your collection.
public class TestClassChild extends TestClassParent

将做同样的事情,只是没有hashCode/equals生成。

 类似资料:
  • 问题内容: 似乎以下代码应返回true,但返回false。 这有什么意义? 问题答案: 常规()和严格()相等之间的唯一区别是,严格相等运算符禁用类型转换。由于已经在比较两个相同类型的变量,因此使用的相等运算符的类型无关紧要。 不管您使用常规相等还是严格相等,对象比较仅 在您比较相同的精确对象时得出 。 也就是说,给定,,,但。 两个不同的对象(即使它们都具有零或相同的精确属性)也永远不会相等地进

  • 问题内容: 我有以下JSON: 并使用Gson反序列化它。之后,我需要合并JPA实体: 刷新从模型级联到子对象,再级联到各个国家。这会导致Hibernate出现异常“已将实体副本分配给其他实体”。 如果我使用其他国家/地区,则可以使用。如果我使用将国家/地区实例从一个对象复制到另一个对象,那么这两个子对象都引用该对象的同一实例,则该方法有效。 两国具有相同的价值观。两者也具有相同的hashCode

  • 问题内容: Hashcode()和equals()的概念是 1)如果两个对象根据equal()相等,则在这两个对象中的每一个上调用hashcode方法应产生相同的哈希码。 另一个是 2)如果两个对象根据equal()不相等,则不需要在两个对象中的每一个上调用hashcode方法必须产生不同的值。 我尝试并理解了第一个,这是第一点的代码。 上面的程序为两个不同的对象提供了相同的哈希码。 有人可以用一

  • 在阅读equals()和hashcode()时,我了解到,如果两个对象相等,那么它们的hashcode必须相等,反之亦然。 但是下面的例子并没有反映这一点。 如果是,则返回true,即使它们的哈希代码不同,这从打印和中可以明显看出。 有人能给我解释一下吗?

  • 问题内容: 我明白为什么为两个相等的(通过)对象提供相同的哈希码很重要。但是反之亦然,如果两个对象具有相同的哈希码,它们必须相等吗?合同还存在吗?我找不到一个可能发生这种情况的示例,因为如果所有使用equals方法的属性都被用来覆盖hashcode方法,那么我们将始终对相等的对象使用相同的hashcode。请评论。 问题答案: 如果两个对象相同,则它们不一定相等。否则,您将发现完美的哈希函数。 但

  • 我有两个java类如下 现在我有了一个A级对象Aobj,两个字段都已初始化。我用的是小豆子。copyProperties(Bobj,Aobj),但只有字段值被复制到Bobj中。名称列表为空。有没有办法深度复制一个对象,以便它复制所有字段,包括列表、地图等集合。 我在某个地方听说了推土机,不确定这是否是为了这个目的。