我有一個關于 getReference() 的問題。為什么當我們使用 getReference() 和 remove() 時,getReference() 會命中資料庫并導致 SELECT 陳述句?
我希望在這段代碼中,我們只有兩條陳述句:一條是因為 persist() 的 INSERT,一條是因為 remove() 的 DELETE。
我們知道 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=?
uj5u.com熱心網友回復:
因為您嘗試洗掉的是代理,所以持久性背景關系必須確保該物體存在于資料庫中,因為它必須加載將使其處于托管狀態的物體,然后將其從資料庫中洗掉并將其狀態更改為已洗掉等資料庫和持久化背景關系保持同步
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/459044.html
