【发布时间】:2020-09-01 15:37:53
【问题描述】:
我想更新实体而不更新/编辑子实体。 这是有问题的实体:
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
//other fields omitted for brevity
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "project_user",
joinColumns = @JoinColumn(name="user_id", updatable = false),
inverseJoinColumns = @JoinColumn(name="project_id",updatable = false))
@JsonIgnore
private Set<Project> projects;
//getters and setters omitted for brevity
@Override
public int hashCode() {
return id;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (id != other.id)
return false;
return true;
}
}
这里是项目实体:
@Entity
@Table(name = "project")
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
//other fields omitted for brevity
@ManyToMany
@JoinTable(name = "project_user",
joinColumns = @JoinColumn(name="project_id"),
inverseJoinColumns = @JoinColumn(name="user_id"))
@JsonIgnoreProperties(value = {"projects", "connected", "notifications"})
private Set<User> members;
@Override
public int hashCode() {
return id;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Project other = (Project) obj;
if (id != other.getId())
return false;
return true;
}
}
这是合并过程:
@Override
public void update(User user) {
//user is created from a dto as a new object (that has its id set manually)
entityManager.merge(user);
}
问题是从连接表中删除休眠日志。我怎样才能阻止它?
休眠日志
Hibernate: //login query
select
distinct authuser0_.id as id1_7_,
authuser0_.enabled as enabled8_7_,
authuser0_.password as password5_7_,
authuser0_.username as username6_7_,
roles1_.username as username1_0_0__,
roles1_.authority as authorit2_0_0__
from
users authuser0_
inner join
authorities roles1_
on authuser0_.username=roles1_.username
where
authuser0_.username=?
Hibernate: //entityManager.merge() calls this to merge it
select
user0_.id as id1_7_0_,
user0_.email as email2_7_0_,
user0_.first_name as first_na3_7_0_,
user0_.image as image7_7_0_,
user0_.last_name as last_nam4_7_0_,
user0_.password as password5_7_0_,
user0_.username as username6_7_0_
from
users user0_
where
user0_.id=?
Hibernate: //the actual update statement
update
users
set
email=?,
first_name=?,
image=?,
last_name=?,
password=?,
username=?
where
id=?
Hibernate: // not wanted, need to stop this query
delete
from
project_user
where
user_id=?
我在网上读到它与equals和hashcode有关。但是,我似乎无法让它工作。
我知道两个都不是最佳选择:
- 编写本机查询而不是合并方法。问题:不可扩展,每次更改都需要手动编辑
- 为表创建一个新实体(因此该表将有 2 个映射到它的实体),而不附加到其他表。问题:重复的代码和实体
提前致谢
【问题讨论】:
标签: mysql spring spring-boot hibernate jpa