gpt4 book ai didi

java - 如何修复正确添加到设置 Hibernate 实体

转载 作者:行者123 更新时间:2023-11-30 01:54:24 24 4
gpt4 key购买 nike

我读了一篇关于正确重定义 equals/hashCode 的文章: https://vladmihalcea.com/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/

执行这些覆盖是为了不丢失已写入集合的记录。

代码:

@Entity
public class Client {

@Id
@Column
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column
private String name;

public Client() {
}

public Client(String name) {
this.name = name;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Client client = (Client) o;
return Objects.equals(id, client.id) &&
Objects.equals(name, client.name);
}

public int hashCode() {
return 31;
}

@Override
public String toString() {
final StringBuilder sb = new StringBuilder("Client{");
sb.append("id=").append(id);
sb.append(", name='").append(name).append('\'');
sb.append('}');
return sb.toString();
}
}

然后我测试我的类以确保它正常工作:

@Transactional
public class ClientTest {

@PersistenceContext
protected EntityManager em;

@Test
public void storeToSetBeforeMerge_ShouldBeContains() {
Set<Client> map = new HashSet<>();
Client client1 = new Client("John");
Client client2 = new Client("Mike");
map.add(client1);
map.add(client2);

Client merge1 = em.merge(client1);
Client merge2 = em.merge(client2);

assertTrue(map.contains(merge1)); // not true!
assertTrue(map.contains(merge2)); // not true!
}
}

我的问题是为什么条件不满足。毕竟,我已经指出 hashCode 返回相同的值:31。我做错了什么?

我无法理解这个决定的意义。如果这个解决方案不能解决问题,我无法从Set中找到我需要的元素

最佳答案

您没有像文章中那样在 merge() 之前调用 persist() 。文章作者在第一条评论中对此进行了解释。

Merge is for integrating changes on detached entities, which have been persisted previously.

新实体的生命周期从persist()开始。然后在具有 ID 的分离实体上调用 merge() ,条件将得到满足。

关于java - 如何修复正确添加到设置 Hibernate 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54973855/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com