В процессе обучения Maven создал простой проект JPA (Java Persistence 1.0.2 с реализацией EclipseLink 2.0.2).Это среда, управляемая приложениями.Поэтому я вручную контролирую жизненный цикл EntityManager.
Файл persistence.xml, используемый основным исходным кодом, отличается от того, который использует код модульного теста (также предлагается здесь ).Основной код использует базу данных Oracle, а тестовый код использует дерби в памяти.Запуск модульных тестов обновлял базу данных Oracle (!), И мне в конце концов удалось это исправить, используя два разных модуля персистентности в файлах XML.
Однако я не понимаю, почему это решило проблему.Я вручную создаю и закрываю менеджеры сущностей, и они не работают одновременно.Я почти уверен, что Maven (или способ, которым я его настроил) не испортит ресурсы (файлы XML).Фактически, глядя на выходные данные отладки Maven, я вижу, что он использует правильный файл XML для модульных тестов.На самом деле я не понимаю, почему это должно быть проблемой с самого начала.
Может ли кто-нибудь просветить меня, пожалуйста?
- Обновлено
Вот src /main / resources / META-INF / Persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="MainPU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>org.domain.Book</class>
<class>org.domain.Tag</class>
<properties>
<property name="eclipselink.target-database" value="Oracle" />
<property name="eclipselink.logging.level" value="INFO" />
<property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver" />
<property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@xxx:1526:XE" />
<property name="javax.persistence.jdbc.user" value="usr" />
<property name="javax.persistence.jdbc.password" value="pass" />
</properties>
</persistence-unit>
</persistence>
, а вот src / test / resources / META-INF / Persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="TestPU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>org.domain.Book</class>
<class>org.domain.Tag</class>
<properties>
<property name="eclipselink.target-database" value="DERBY" />
<property name="eclipselink.ddl-generation" value="drop-and-create- tables" />
<property name="eclipselink.logging.level" value="FINE" />
<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" />
<property name="javax.persistence.jdbc.url" value="jdbc:derby:memory:testDB;create=true" />
<property name="javax.persistence.jdbc.user" value="usr" />
<property name="javax.persistence.jdbc.password" value="pass" />
</properties>
</persistence-unit>
</persistence>
Основной источникcode:
....
EntityManagerFactory emf = Persistence.createEntityManagerFactory("MainPU");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Iterator<Book> booksItr = books.iterator();
while (booksItr.hasNext())
em.persist(booksItr.next());
tx.commit();
em.close();
emf.close();
...
и исходный код модульного теста практически одинаков за исключением того, что для создания EntityManagerFactory используется «TestPU».