首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择查询后的Hibernate 6 perfroms更新查询

选择查询后的Hibernate 6 perfroms更新查询
EN

Stack Overflow用户
提问于 2022-07-26 21:20:10
回答 1查看 99关注 0票数 0

我写了一个简单的名为"User“的实体,另一个叫做"Company”。用户实体内部有@ManyToOne(fetch = LAZY)映射。当我创建会话对象并调用get()方法时,Hibernate执行select查询并在更新之后,为什么?

用户实体:

代码语言:javascript
复制
@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;
}

公司实体:

代码语言:javascript
复制
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@ToString
@Builder
@Entity
public class Company {
    @Id
    @GeneratedValue(strategy = IDENTITY)
    private Long id;

    private String name;
}

Main:

代码语言:javascript
复制
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控制台日志:

代码语言:javascript
复制
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=?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-29 11:22:40

详情请参见https://hibernate.org/community/contribute/intellij-idea/#debugging。问题是您的一些toString()实现( IntelliJ调试器调用)访问未初始化的实体/集合代理的状态,这将导致延迟初始化,从而导致选择查询。如果有挂起的刷新(insert/update/delete)影响即将从其中选择的表之一,则Hibernate强制执行挂起的刷新。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73129859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档