为什么当我们将 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=?
因为您尝试删除的是一个代理,所以持久性上下文必须确保该实体存在于数据库中,因为它必须加载该实体,使其处于托管状态,然后将其从数据库中删除并更改其要删除的状态,并希望数据库和持久性上下文保持同步
我有一个关于 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=?
因为您尝试删除的是一个代理,所以持久性上下文必须确保该实体存在于数据库中,因为它必须加载该实体,使其处于托管状态,然后将其从数据库中删除并更改其要删除的状态,并希望数据库和持久性上下文保持同步