Hibernate 6在选择查询之后执行更新查询



我写了一个名为"用户";另一个被称为";公司";。用户实体内部有@ManyToOne(fetch=LAZY(映射的公司。当我创建会话对象并调用get((方法时,Hibernate执行select查询,并在它更新后,为什么?

用户实体:

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@ToString
@Builder
@Entity
@Table(name = "users")
public class User2 {
@Id
@GeneratedValue(strategy = IDENTITY)
private Long id;
@Column(unique = true)
private String username;
@Embedded
@EqualsAndHashCode.Exclude
private PersonalInfo personalInfo;
@Enumerated(STRING)
@EqualsAndHashCode.Exclude
private Role role;
@Type(JsonType.class)
@EqualsAndHashCode.Exclude
private String info;
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "company_id")
@EqualsAndHashCode.Exclude
@ToString.Exclude
private Company company;
}

公司实体:

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@ToString
@Builder
@Entity
public class Company {
@Id
@GeneratedValue(strategy = IDENTITY)
private Long id;
private String name;
}

Main:

public class HibernateEntityMappingRunner {
public static void main(String[] args) {
try (SessionFactory sessionFactory = buildSessionFactory();
Session session = sessionFactory.openSession()
) {
session.beginTransaction();
User2 user2 = session.get(User2.class, 2);
session.getTransaction().commit();
}
}
}

休眠控制台日志:

Hibernate: 
select
u1_0.id,
u1_0.company_id,
u1_0.info,
u1_0.birth_date,
u1_0.firstname,
u1_0.lastname,
u1_0.role,
u1_0.username 
from
users u1_0 
where
u1_0.id=?
Hibernate: 
update
users 
set
company_id=?,
info=?,
birth_date=?,
firstname=?,
lastname=?,
role=?,
username=? 
where
id=?

请参阅https://hibernate.org/community/contribute/intellij-idea/#debugging详细信息。问题是,您的一些toString()实现(IntelliJ调试器调用(访问未初始化的实体/集合代理的状态,这将导致延迟初始化,从而导致选择查询。如果有挂起的刷新(插入/更新/删除(会影响将要从中选择的表之一,Hibernate会强制执行挂起的清除。

通过更改toString()实现或更改IntelliJ在调试器中显示对象的方式,可以避免这种情况。

最新更新