Я пытаюсь создать модульный тест для моего кода персистентности.
Я использую Hibernate с аннотациями JPA. У меня нет файла persistence.xml (который используется во всех статьях о модульном тестировании JPA).
Я не хочу использовать spring или создавать файл persistence.xml, потому что у меня много классов сохраняемости, и инициализация hibernate для всех из них занимает много времени, поэтому я хочу явно добавить классы в hibernate.
Также я не могу использовать configuration.createSessionFactory()
, как это рекомендовано в статьях модульного тестирования Hibernate, потому что мои DAO имеют JPA EntityManager, внедренный Spring.
Итак, я использую EntityManagerFactoryImpl
:
AnnotationConfiguration configuration = new AnnotationConfiguration();
configuration.setProperty(Environment.DRIVER,"org.apache.derby.jdbc.EmbeddedDriver");
configuration.setProperty(Environment.URL,"jdbc:derby:memory:srf.derby;create=true");
configuration.setProperty(Environment.USER, "");
configuration.setProperty(Environment.DIALECT, DerbyDialect.class.getName());
configuration.setProperty(Environment.SHOW_SQL, "true");
configuration.setProperty(Environment.HBM2DDL_AUTO, "create-drop");
configuration.setProperty( Environment.AUTOCOMMIT, "true");
configuration.addAnnotatedClass(MyPersistentClass.class);
MyHibernateDAO dao = new MyHibernateDAO();
EntityManagerFactoryImpl entityManagerFactory = new EntityManagerFactoryImpl(
configuration.buildSessionFactory(),
PersistenceUnitTransactionType.RESOURCE_LOCAL,
true,
null,
configuration);
dao.setEntityManager(entityManagerFactory.createEntityManager());
Это выглядит нормально, но по какой-то причине никакие вставки не запускаются в db, в то время как все селекты в порядке (я показал SQL true). Похоже, что AUTOCOMMIT ложно (в производственном мире Spring управляет транзакциями). Как вы видите, я установил для конфигурации значение AUTOCOMMIT true, я даже извлекаю соединение JDBC из EntityManager и вижу в отладчике, что autocommit имеет значение true, но вставки запускаются, только если в моем модульном тесте я явно начинаю и фиксирую транзакцию.
Что я делаю не так? Как я могу сделать мой тест запущенным в autocommit?
Спасибо!