为什么当我们将 getReference() 与 remove() 一起使用时,getReference() 命中数据库并导致 SELECT 语句

why when we use getReference() with remove(), getReference() hits the Database and causes a SELECT statement

我有一个关于 getReference() 的问题。 为什么当我们将 getReference() 与 remove() 一起使用时,getReference() 会访问数据库并导致 SELECT 语句?

我希望在这段代码中,我们只有 2 个语句: 一个 INSERT 因为 persist() 和一个 DELETE 因为 remove()。

我们知道 getReference() 生成一个代理对象并且在需要时才访问数据库。那么为什么我们的输出中有一个 SELECT?

public class RemoveThirdTestMain {

    static EntityManagerFactory emf = Persistence.createEntityManagerFactory("pu");

    public static void main(String[] args) {
        RemoveThirdTestMain remThird = new RemoveThirdTestMain();
        remThird.removeManagedObject2();
    }

    private void removeManagedObject2() {

        EntityManager entityManager = emf.createEntityManager();
        entityManager.getTransaction().begin(); // begin tx.

        Person p1 = new Person("Mo", "As");

        entityManager.persist(p1); // will cause a INSERT.

        entityManager.getTransaction().commit(); // commit tx.
        entityManager.close();

        entityManager = emf.createEntityManager();
        entityManager.getTransaction().begin(); // begin tx.


        Person theP1 = entityManager.getReference(Person.class, 1L); 

        entityManager.remove(theP1); // will cause a DELETE.

        entityManager.getTransaction().commit();
        entityManager.close();

    }
}

这是我的输出:

Hibernate: insert into Person (firstName, lastName) values (?, ?)
Hibernate: select person0_.id as id1_2_0_, person0_.firstName as firstnam2_2_0_, person0_.lastName as lastname3_2_0_ from Person person0_ where person0_.id=?
Hibernate: delete from Person where id=?

因为您尝试删除的是一个代理,所以持久性上下文必须确保该实体存在于数据库中,因为它必须加载该实体,使其处于托管状态,然后将其从数据库中删除并更改其要删除的状态,并希望数据库和持久性上下文保持同步