我写了一个简单的名为"User“的实体,另一个叫做"Company”。用户实体内部有@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控制台日志:
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=?发布于 2022-07-29 11:22:40
详情请参见https://hibernate.org/community/contribute/intellij-idea/#debugging。问题是您的一些toString()实现( IntelliJ调试器调用)访问未初始化的实体/集合代理的状态,这将导致延迟初始化,从而导致选择查询。如果有挂起的刷新(insert/update/delete)影响即将从其中选择的表之一,则Hibernate强制执行挂起的刷新。
通过更改toString()实现或更改IntelliJ在调试器中显示对象的方式,可以避免这种情况。
https://stackoverflow.com/questions/73129859
复制相似问题