Сейчас я нахожусь в процессе реструктуризации проекта для использования JPA. Я реализовал JPA в ряде проектов, но проблема, с которой я здесь сталкиваюсь, заключается в интеграционных тестах, которые были разработаны, когда этот проект использовал традиционную JDBC для обработки соединений. Методы, которые у меня есть, в настоящее время внедряют менеджер сущностей при выполнении операций JPA. Мой файл persistence.xml в настоящее время указывает на источник данных JTA, доступ к которому возможен только при развертывании приложения. Для моих интеграционных тестов я хотел бы создать EntityManagerFactory, который использует файл «test-persistence.xml», используя локальный тип транзакции ресурса и пул соединений, чтобы я мог запускать эти интеграционные тесты локально, не развертывая свое приложение. Каков наилучший способ достичь этого? Я провел большое количество исследований по этому вопросу, и я изо всех сил пытаюсь найти правильный способ достижения этой цели. В настоящее время я использую EclipseLink в качестве поставщика JPA. Буду признателен за любую помощь.
Вот пример одного из моих методов JPA:
@Default
@Dependent
public class DefaultLayoutProcedure {
@PersistenceContext(unitName = "DB")
EntityManager em;
public int getDefaultLayout(String selectedSeries, String selectedStyle, String selectedMaterial,
String selectedColor, double beltWidthInLinks) throws BpgDataAccessException
{
List<DefaultLayoutEntity> defaultLayoutEntity = null;
int defaultLayoutID = 0;
try
{
Query q = em.createNamedStoredProcedureQuery("GetDefaultLayout");
q.setParameter("p_series", selectedSeries)
.setParameter("p_style", selectedStyle)
.setParameter("p_material", selectedMaterial)
.setParameter("p_color", selectedColor)
.setParameter("p_width_divisor_in_links", beltWidthInLinks);
defaultLayoutEntity = (List<DefaultLayoutEntity>) q.getResultList();
for (int i = 0; i < defaultLayoutEntity.size(); i++)
{
defaultLayoutID = defaultLayoutEntity.get(i).getBeltLayoutID();
}
} catch (Exception e)
{
throw new BpgDataAccessException(e);
}
return defaultLayoutID;
}
}
Вот пример файла «test-persistence.xml», который я хотел бы настроить для моих интеграционных тестов:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="DB" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>entity.DefaultLayoutEntity</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver" />
<property name="javax.persistence.jdbc.url" value="EXAMPLE-URL" />
<property name="javax.persistence.jdbc.user" value="EXAMPLE-USER" />
<property name="javax.persistence.jdbc.password" value="EXAMPLE-PASSWORD" />
<property name="eclipselink.weaving" value="static" />
<property name="eclipselink.logging.level.cache" value="FINEST" />
<property name="eclipselink.deploy-on-startup" value="True"></property>
<property name="eclipselink.jdbc.cache-statements" value="true"/>
<property name="eclipselink.jdbc.bind-parameters" value="true"/>
<property name = "eclipselink.jdbc.read-connections.max" value="5"/>
<property name = "eclipselink.jdbc.read-connections.min" value="1"/>
<property name = "eclipselink.jdbc.read-connections.initial" value="1"/>
<property name = "eclipselink.jdbc.read-connections.shared" value="true"/>
<property name = "eclipselink.jdbc.write-connections.max" value="5"/>
<property name = "eclipselink.jdbc.write-connections.min" value="1"/>
<property name = "eclipselink.jdbc.write-connections.initial" value="1"/>
</properties>
</persistence-unit>
Как мне создать EntityManagerFactory для локального запуска моего интеграционного теста вне контейнера?