为什么 Hibernate 会为同一个实体创建多个对象?

问题描述 投票:0回答:2
  1. 如果您通过存储库和父实体获取子实体,则它们将是两个不同的对象
  2. 如果我们想通过父实体保存子实体,我们也会得到一个不同的对象

在每种情况下,我们都会为同一实体获取多个对象,这会导致违反数据一致性。为什么?这个可以解决吗?

示例:

@Entity
class Kid {
    @Id
    private String id;
    private String parentId;
}

@Entity
class Parent {
    @Id
    private String id;

    @JoinColumn(name = "parentId")
    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Kid> kids = new ArrayList<>();
}
//Ex1
var kid = kidRepo.findAll().get(0); //Kid@11111
var sameKid = parentRepo.findParent().getKids().get(0); //Kid@22222

assertTrue(kid.getId().equals(sameKid.getId()));
assertFalse(kid == sameKid);
//Ex2
var kid = new Kid(parent.getId()); //Kid@11111
var parent = parentRepo.findParent();
parent.getKids().add(kid);
parentRepo.save(parent);
var sameKid = parent.getKids.get(0); //Kid@22222

assertTrue(kid.getId().equals(sameKid.getId()));
assertFalse(kid == sameKid);

P.S:提前谢谢

java spring hibernate jpa orm
2个回答
1
投票

您只需覆盖

equals
hashCode
即可让您的断言生效。您不会从两个不同的存储库和/或查询中获得完全相同的实例,哈哈。你希望 Spring 如何知道?


0
投票

没办法。不可能。这就是 Spring 的工作方式

© www.soinside.com 2019 - 2024. All rights reserved.