Обратите внимание, что "Entity Manager отслеживает сущности с помощью ссылок на объекты Java."
Я могу только сохранять один и тот же объект / ссылку java снова и снова в цикле for, если итолько если я переместу оператор emf = Persistence.createEntityManagerFactory("basicPU")
в цикл.как это:
Листинг 1:
Item item = new Item();
for (int i = 0; i < 1000; ++i) {
emf = Persistence.createEntityManagerFactory("basicPU");
em = emf.createEntityManager();
tx = em.getTransaction();
tx.begin();
item.setId(null);
em.persist(item);
tx.commit();
em.clear();
em.close();
}
Но если цикл for подобен:
Листинг 2:
Item item = new Item();
emf = Persistence.createEntityManagerFactory("basicPU");
for (int i = 0; i < 1000; ++i) {
em = emf.createEntityManager();
tx = em.getTransaction();
tx.begin();
item.setId(null);
em.persist(item);
tx.commit();
em.clear();
em.close();
}
Я получаю EntityExistException.
Означает ли это, что метод emf.createEntityManager () возвращает кэшированную копию EntityManager, которая отслеживает объект элемента, сохраненный в предыдущей итерации цикла for.? БОЛЬШОЙ №. , потому что, когда я пытался выполнить ниже строки ..
emf = Persistence.createEntityManagerFactory("basicPU");
for (int i = 0 ; i<10; i++){
System.out.println(emf.createEntityManager());
}
Он напечатал ..
org.apache.openjpa.persistence.EntityManagerImpl@18105e8
org.apache.openjpa.persistence.EntityManagerImpl@9bad5a
org.apache.openjpa.persistence.EntityManagerImpl@91f005
org.apache.openjpa.persistence.EntityManagerImpl@1250ff2
org.apache.openjpa.persistence.EntityManagerImpl@3a0ab1
org.apache.openjpa.persistence.EntityManagerImpl@940f82
org.apache.openjpa.persistence.EntityManagerImpl@864e43
org.apache.openjpa.persistence.EntityManagerImpl@17c2891
org.apache.openjpa.persistence.EntityManagerImpl@4b82d2
org.apache.openjpa.persistence.EntityManagerImpl@179d854
Что означает emf.createEntityManager() всегда возвращает новый экземпляр entityManager.
Таким образом, в листинге 1 и листинге 2 я всегда получаю новый экземпляр EntityManager, но в листинге 1 я могу сохранить тот же объект в базе данных, но в листинге2 Я получаю EntityExistException.Почему так?
Я думаю, если у меня будет новый EntityManager в обоих листингах (1 и 2), я смогу сохранить один и тот же объект в базе данных, потому что EntityManager отслеживает сущности посредством ссылок на объекты Java и в каждомитерация У меня есть новый EntityManager, который не знает или не должен знать ссылки на объекты, сохраненные / сохраненные в базе данных на предыдущей итерации другим экземпляром объекта EntityManager.