Объект Spring / Hibernate / MySQL / JPA не сохранен - PullRequest
0 голосов
/ 23 июня 2018

Я пытаюсь настроить приложение на использование spring-data-jpa 1.11.13 hibernate 5.2.10 spring 4.3.11.RELEASE

Проблема заключается в том, что объект не сохраняется в хранилище данных MySQL.

Зависимости POM

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>4.3.11.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>4.3.11.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.46</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-dbcp2</artifactId>
        <version>2.1.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>4.3.11.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>5.2.10.Final</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>1.11.13.RELEASE</version>
    </dependency>
  </dependencies>

MySQL DDL-скрипт

DROP TABLE IF EXISTS `property` ;
CREATE TABLE IF NOT EXISTS `property` (
  `id` VARCHAR(60) NOT NULL,
  `supplier_id` VARCHAR(30) NOT NULL,
  `url` VARCHAR(255) NOT NULL,
  `main_pic` VARCHAR(255) NOT NULL,
  `lat` DOUBLE NOT NULL,
  `lng` DOUBLE NOT NULL,
  `sys_type` VARCHAR(30) NOT NULL,
  `name` VARCHAR(255) NOT NULL,
  `description` TEXT NOT NULL,
  `one_liner` VARCHAR(255) NOT NULL DEFAULT '',
  `num_bedrooms` TINYINT(127) NOT NULL,
  `num_bathrooms` TINYINT(127) NOT NULL,
  `max_occ` TINYINT(127) NOT NULL,
  `country` CHAR(2) NOT NULL,
  `rating` DOUBLE NOT NULL DEFAULT 0,
  `num_raters` INT NOT NULL DEFAULT 0,
  `rank` DOUBLE NOT NULL DEFAULT 0,
  `lowest_ppn` DOUBLE NOT NULL DEFAULT 0,
  `max_ppn` DOUBLE NOT NULL DEFAULT 0,
  `avg_ppn` DOUBLE NOT NULL DEFAULT 0,
  `private_pool` TINYINT(1) NOT NULL DEFAULT 0,
  `pool` TINYINT(1) NOT NULL DEFAULT 0,
  `internet_access` TINYINT(1) NOT NULL DEFAULT 0,
  `air_conditioning` TINYINT(1) NOT NULL DEFAULT 0,
  `bbq` TINYINT(1) NOT NULL DEFAULT 0,
  `satellite` TINYINT(1) NOT NULL DEFAULT 0,
  `hot_tub` TINYINT(1) NOT NULL DEFAULT 0,
  `sauna` TINYINT(1) NOT NULL DEFAULT 0,
  `parking` TINYINT(1) NOT NULL DEFAULT 0,
  `instant_book` TINYINT(1) NOT NULL DEFAULT 0,
  `updated` DATETIME NOT NULL DEFAULT NOW(),
  PRIMARY KEY (`id`, `supplier_id`))
ENGINE = InnoDB;

Сущность (равно / hashcode / getters / setters, пропущенные для сохранения символов)

@Entity
@Table(name="property")
public class Property {

    @EmbeddedId
    private PropertyCompositeKey id;
    @NotNull
    @Column(name="url")
    private String url;
    @Column(name="main_pic")
    @NotNull
    private String mainPic;
    @Column(name="lat")
    @Min(-180)
    @Max(180)
    @NotNull
    private Double lat;
    @Column(name="lng")
    @Min(-90)
    @Max(90)
    @NotNull
    private Double lng;
    @Column(name="type")
    @NotNull
    private String externalType;
    @Column(name="name")
    @NotNull
    private String name;
    @Column(name="description")
    @NotNull
    private String description;
    @Column(name="num_bedrooms")
    @Min(1)
    @NotNull
    private Integer numBedrooms;
    @Column(name="num_bathrooms")
    @Min(1)
    @NotNull
    private Integer numBathrooms;
    @Column(name="max_occ")
    @Min(1)
    @NotNull
    private Integer maxOcc;
    @Column(name="country")
    @Length(min=2,max=2)
    @NotNull
    private String country;
    @Column(name="rating")
    private Double rating;
    @Column(name="num_raters")
    private Integer numRaters;
    @Column(name="rank")
    private Double rank;
    @Column(name="lowest_ppn")
    @Min(1)
    private Double lowestPpn;
    @Column(name="max_ppn")
    @Min(1)
    private Double maxPpn;
    @Column(name="avg_ppn")
    @Min(1)
    private Double avgPpn;
    @Column(name="private_pool")
    private Boolean privatePool;
    @Column(name="pool")
    private Boolean pool;
    @Column(name="internet_access")
    private Boolean internetAccess;
    @Column(name="air_conditioning")
    private Boolean airConditioning;
    @Column(name="bbq")
    private Boolean bbq;
    @Column(name="satellite")
    private Boolean satellite;
    @Column(name="hot_tub")
    private Boolean hotTub;
    @Column(name="sauna")
    private Boolean sauna;
    @Column(name="parking")
    private Boolean parking;
    @Column(name="instant_book")
    private Boolean instantBook;
    @Column(name="updated")
    @Version
    private Timestamp updated;

    public void setKey(String id, String supplierId) {
        PropertyCompositeKey pck = new PropertyCompositeKey();
        pck.setId(id);
        pck.setSupplierId(supplierId);
        this.id = pck;
    }
}

Встраиваемый - составной первичный ключ

@Embeddable
public class PropertyCompositeKey implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 6575008230123343148L;
    @Column(name="id")
    @NotNull
    private String id;
    @Column(name="supplier_id")
    @NotNull
    private String supplierId;
}

Хранилище

@Repository
public interface PropertyRepository extends JpaRepository<Property, PropertyCompositeKey> {

}

Сервисный интерфейс

public interface PropertiesService {

    Property save(Property property);
}

Реализация сервиса

@Service
public class PropertyServiceImpl implements PropertiesService {

    @Autowired
    private PropertyRepository repo;

    @Override
    @Transactional
    public Property save(Property property) {
        Property saved =  repo.save(property);
        return saved;
    }

}

SpringКласс конфигурации

@Configuration
@EnableJpaRepositories("property.dao")
@EnableTransactionManagement
@PropertySource(
        value={"classpath:/properties.properties"},
        ignoreResourceNotFound = false)
@ComponentScan(basePackages={"property.properties"})
public class PropertySpringConfig {

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertyConfigurer() {
       return new PropertySourcesPlaceholderConfigurer();
    }
    @Bean 
    public DataSource dataSource(@Value("${jdbc.driverClassName}") String driverClass,
            @Value("${jdbc.url}") String url,
            @Value("${jdbc.username}") String un,
            @Value("${jdbc.password}") String pw,
            @Value("${jdbc.minIdleConnections}") int mi,
            @Value("${jdbc.initialPoolSize}") int is) {
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName(driverClass);
        ds.setUrl(url);
        ds.setUsername(un);
        ds.setPassword(pw);
        ds.setMinIdle(mi);
        ds.setInitialSize(is);
        return ds;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource);
        em.setPackagesToScan(new String[] { "property.entity" });
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        em.setJpaProperties(additionalProperties());
        return em;
    }

    @Bean
    public PlatformTransactionManager transactionManager(LocalContainerEntityManagerFactoryBean entityManagerFactory, DataSource ds) {
        JpaTransactionManager jtm = new JpaTransactionManager();
        jtm.setEntityManagerFactory(entityManagerFactory.getNativeEntityManagerFactory());
        jtm.setDataSource(ds);
        return jtm;
    }

    Properties additionalProperties() {
       Properties properties = new Properties();
       properties.setProperty(
         "hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
       return properties;
   }
}

Контрольный пример

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader=AnnotationConfigContextLoader.class,classes=PropertySpringConfig.class)
public class TestRepository {

    @Autowired
    private PropertiesService propertyRepository;

    @Test
    @Commit
    public void testRepository() {
        Property p = new Property();
        p.setKey("TEST_ID", "TEST_SUPPLIER");
        p.setAirConditioning(true);
        p.setAvgPpn(500.0);
        p.setCountry("ES");
        p.setDescription("TEST DESCRIPTION");
        p.setExternalType("TEST");
        p.setHotTub(false);
        p.setLat(12.5);
        p.setLng(45.6);
        p.setLowestPpn(150.4);
        p.setMainPic("TEST");
        p.setMaxOcc(5);
        p.setMaxPpn(777.4);
        p.setName("TEST NAME");
        p.setNumBathrooms(3);
        p.setNumBedrooms(7);
        p.setNumRaters(5);
        p.setPrivatePool(true);
        p.setRank(1.0);
        p.setRating(4.5);
        p.setUrl("TEST");
        Property s = propertyRepository.save(p);

    }
}

Когда я запускаю тест, он завершается без ошибок, но объект не сохраняется.Выйти из системы для сохранения:

DEBUG: org.springframework.orm.jpa.JpaTransactionManager - Создание новой транзакции с именем [property.service.PropertyServiceImpl.save]: PROPAGATION_REQUIRED, ISOLATION_DEFAULT;''
DEBUG: org.springframework.orm.jpa.JpaTransactionManager - Открыт новый EntityManager [SessionImpl (PersistenceContext [entityKeys = [], collectionKeys = []]; ActionQueue [inserttions = ExecutableList {size = 0} updates = ExecutableList {size = 0} delete = ExecutableList {size = 0} orphanRemovals = ExecutableList {size = 0} collectionCreations = ExecutableList {size = 0} collectionRemovals = ExecutableList {size = 0} collectionUpdates = ExecutableList {размер = 0} collectionQueuedOps = ExecutableList {size =0} unresolvedInsertDependencies = null])] для транзакции JPA
DEBUG: org.hibernate.engine.transaction.internal.TransactionImpl - begin
DEBUG: org.springframework.orm.jpa.JpaTransactionManager - не подвергать транзакции JPA [сеанс(PersistenceContext [entityKeys = [], collectionKeys = []]; ActionQueue [вставки = ExecutableList {размер = 0} обновления = ExecutableList {size = 0} удаления = ExecutableList {size = 0} orphanRemovals = ExecutableList {size = 0} collectionCreations =ExecutableList {size = 0} collectionRemovals = ExecutableList {size =0} collectionUpdates = ExecutableList {size = 0} collectionQueuedOps = ExecutableList {size = 0} unresolvedInsertDependencies = null])] как транзакция JDBC, поскольку JpaDialect [org.springframework.orm.jpa.DefaultJpaDialect@ccd1bc3] не поддерживает соединение 10 JDBC.* DEBUG: org.springframework.data.repository.core.support.TransactionalRepositoryProxyPostProcessor $ CustomAnnotationTransactionAttributeSource - добавление транзакционного метода 'save' с атрибутом: PROPAGATION_REQUIRED, ISOLATION_DEFAULT;''
DEBUG: org.springframework.orm.jpa.JpaTransactionManager - Обнаружен связанный с потоком EntityManager [SessionImpl (PersistenceContext [entityKeys = [], collectionKeys = []]; ActionQueue [inserttions = ExecutableList {size = 0} updates =ExecutableList {size = 0} delete = ExecutableList {size = 0} orphanRemovals = ExecutableList {size = 0} collectionCreations = ExecutableList {size = 0} collectionRemovals = ExecutableList {размер = 0} collectionUpdates = ExecutableList {размер = 0} collectionQueuedOps = ExecutableList {size = 0} unresolvedInsertDependencies = null])] для транзакции JPA
DEBUG: org.springframework.orm.jpa.JpaTransactionManager - Участие в существующей транзакции
DEBUG: org.springframework.orm.jpa.EntityManagerFactoryUtilM -
DEBUG: org.springframework.orm.jpa.EntityManagerFactoryUtils - Регистрация синхронизации транзакции для JPA EntityManager
DEBUG: org.hibernate.event.internal.AbstractSaveEventListener - Сгенерированный идентификатор: component [id, supplierId T] {T_SUPPLIER, id = TEST_ID}, с использованием стратегии: org.hibernate.id.CompositeNestedGeneratedValueGenerator
ОТЛАДКА: org.springframework.orm.jpa.EntityManagerFactoryUtils - Закрытие JPA EntityManager * 1045g.Инициирование транзакции
DEBUG: org.springframework.orm.jpa.JpaTransactionManager - фиксация транзакции JPA в EntityManager[SessionImpl (PersistenceContext [entityKeys = [], collectionKeys = []]; ActionQueue [Вставки = ExecutableList {размер = 0} updates = ExecutableList {size = 0} удалений = ExecutableList {size = 0} orphanRemovals = ExecutableList {размер = 0} collectionCreations = ExecutableList {размер = 0} collectionRemovals = ExecutableList {размер = 0} collectionUpdates = ExecutableList {размер = 0} collectionQueuedOps = ExecutableList {размер = 0} unresolvedInsertDependencies = NULL])]
DEBUG: org.hibernate.engine.transaction.internal.TransactionImpl - фиксация
ОТЛАДКА: org.springframework.orm.jpa.JpaTransactionManager - Закрытие JPA EntityManager [SessionImpl (PersistenceContext [entityKeys = [], collectionKeys = []]; ActionQueue [Вставки = ExecutableList {размер = 0} updates = ExecutableList {size = 0} удалений = ExecutableList {size = 0} orphanRemovals = ExecutableList {размер = 0} collectionCreations = ExecutableList {размер = 0} collectionRemovals = ExecutableList {размер = 0} collectionUpdates = ExecutableList {размер = 0} collectionQueuedOps = ExecutableList {размер = 0} unresolvedInsertDependencies = null])] после транзакции
DEBUG: org.springframework.orm.jpa.EntityManagerFactoryUtils - закрытие JPA EntityManager
DEBUG: org.springframework.test.context.support.AbstractDirtiesContextTestExecutionListener - После метода тестирования: context [DefaultTestContext @ 50f8360d testClass = TestRepository, testInstance = property.TestRepository@61a485d2, testMethod = testRepository @ TestRepository, testException = [null], mergedContextConfiguration = [MergedContextConfiguration @ 2cb4c3ab testClass = TestRepository, location = '{}', classes = '{class property.spring.config.PropertySpringConfig}», contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextCustomizers = set [[empty]], contextLoader = 'Org.springframework.test.context.support.AnnotationConfigContextLoader', parent = [null]]], класс с аннотацией @DirtiesContext [false] с mode [null], метод, аннотированный @DirtiesContext [false] с mode [Пустой].
DEBUG: org.springframework.test.context.support.AbstractDirtiesContextTestExecutionListener - После тестового класса: context [DefaultTestContext @ 50f8360d testClass = TestRepository, testInstance = [null], testMethod = [null], testException = [null], mergedContextConfiguration = [MergedContextConfiguration @ 2cb4c3ab testClass = TestRepository, location = '{}', classes = '{class property.spring.config.PropertySpringConfig}», contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextCustomizers = set [[empty]], contextLoader = 'Org.springframework.test.context.support.AnnotationConfigContextLoader', parent = [null]]], класс с аннотацией @DirtiesContext [false] с режим [ноль]. ИНФОРМАЦИЯ : org.springframework.context.support.GenericApplicationContext - закрытие org.springframework.context.support.GenericApplicationContext@643b1d11: дата запуска [сб. 23 июня 12:53:04 BST 2018]; корень контекстной иерархии
ИНФОРМАЦИЯ : org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Закрытие JPA EntityManagerFactory для единицы сохраняемости по умолчанию
DEBUG: org.hibernate.internal.SessionFactoryImpl - HHH000031: закрытие
DEBUG: org.hibernate.engine.spi.CascadeStyles - Внешний каскадный стиль regsitration [persist: STYLE_PERSIST] отменяет базовую регистрацию [STYLE_PERSIST_SKIPLAZY]
DEBUG: org.hibernate.service.internal.AbstractServiceRegistryImpl - Неявно уничтожая ServiceRegistry по снятию с учета всех детей ServiceRegistries
DEBUG: org.hibernate.boot.registry.internal.BootstrapServiceRegistryImpl - Неявное уничтожение реестра Boot-strap при отмене регистрации всех Служба поддержки ребенка

Когда я изменил метод в PropertyServiceImpl для использования saveAndFlush метода JpaRepository, тест содержит следующий вывод журнала с ошибкой:

DEBUG: org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl

- транзакция JDBC, помеченная только для отката (исключение предусмотрено для трассировки стека) java.lang.Exception: исключение только для целей обеспечения трассировки стека в org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl $ TransactionDriverControlImpl.markRollbackOnly (JdbcResourceLocalTransactionCoordinatorImpl.java:255) в org.hibernate.engine.transaction.internal.TransactionImpl.setRollbackOnly (TransactionImpl.java:143) в org.springframework.orm.jpa.JpaTransactionManager $ JpaTransactionObject.setRollbackOnly (JpaTransactionManager.java:655) в org.springframework.orm.jpa.JpaTransactionManager.doSetRollbackOnly (JpaTransactionManager.java:566) в org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback (AbstractPlatformTransactionManager.java:860) в org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback (AbstractPlatformTransactionManager.java:830) в org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing (TransactionAspectSupport.java:522) в org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction (TransactionAspectSupport.java:286) в org.springframework.transaction.interceptor.TransactionInterceptor.invoke (TransactionInterceptor.java:96) в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) в org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke (PersistenceExceptionTranslationInterceptor.java:136) в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor $ CrudMethodMetadataPopulationMethodInterceptor.invoke (CrudMethodMetadataPostProcessor.java:133) в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) в org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke (ExposeInvocationInterceptor.java:92) в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) в org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke (SurroundingTransactionDetectorMethodInterceptor.java:57) в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) в org.springframework.aop.framework.JdkDynamicAopProxy.invoke (JdkDynamicAopProxy.java:213) на com.sun.proxy. $ Proxy51.saveAndFlush (неизвестный источник) at property.service.PropertyServiceImpl.save (PropertyServiceImpl.java:19) at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) at sun.reflect.NativeMethodAccessorImpl.invoke (неизвестный источник) at sun.reflect.DelegatingMethodAccessorImpl.invoke (неизвестный источник) в java.lang.reflect.Method.invoke (Неизвестный источник) в org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection (AopUtils.java:333) в org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint (ReflectiveMethodInvocation.java:190) в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:157) в org.springframework.transaction.interceptor.TransactionInterceptor $ 1.proceedWithInvocation (TransactionInterceptor.java:99) в org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction (TransactionAspectSupport.java:282) в org.springframework.transaction.interceptor.TransactionInterceptor.invoke (TransactionInterceptor.java:96)в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) в org.springframework.aop.framework.JdkDynamicAopProxy.invoke (JdkDynamicAopProxy.java:213) на com.sun.proxy. $ Proxy52.save (неизвестный источник) в TestRepository.testRepository (TestRepository.java:62) at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) at sun.reflect.NativeMethodAccessorImpl.invoke (неизвестный источник) at sun.reflect.DelegatingMethodAccessorImpl.invoke (неизвестный источник) в java.lang.reflect.Method.invoke (Неизвестный источник) в org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall (FrameworkMethod.java:50) в org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.java:12) в org.junit.runners.model.FrameworkMethod.invokeExplosively (FrameworkMethod.java:47) в org.junit.internal.runners.statements.InvokeMethod.evaluate (InvokeMethod.java:17) в org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate (RunBeforeTestMethodCallbacks.java:75) в org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate (RunAfterTestMethodCallbacks.java:86) в org.springframework.test.context.junit4.statements.SpringRepeat.evaluate (SpringRepeat.java:84) в org.junit.runners.ParentRunner.runLeaf (ParentRunner.java:325) в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild (SpringJUnit4ClassRunner.java:252) в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild (SpringJUnit4ClassRunner.java:94) в org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:290) в org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:71) в org.junit.runners.ParentRunner.runChildren (ParentRunner.java:288) в org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:58) в org.junit.runners.ParentRunner $ 2.evaluate (ParentRunner.java:268) в org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate (RunBeforeTestClassCallbacks.java:61) в org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate (RunAfterTestClassCallbacks.java:70) в org.junit.runners.ParentRunner.run (ParentRunner.java:363) в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run (SpringJUnit4ClassRunner.java:191) в org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run (JUnit4TestReference.java:86) в org.eclipse.jdt.internal.junit.runner.TestExecution.run (TestExecution.java:38) в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:459) в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:678) в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run (RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:192)

Я не вижу, что я пропустил.

Скажите, пожалуйста, что я могу сделать, чтобы исправить это и сохранить сущность в хранилище данных?

Ответы [ 2 ]

0 голосов
/ 23 июня 2018

Проблема заключалась в использовании LocalContainerEntityManagerFactoryBean и последующем использовании метода getNativeEntityManagerFactory() при инициализации компонента PlatformTransactionManager.Правильный способ инициализации диспетчера транзакций:

@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf, DataSource ds) {
    JpaTransactionManager jtm = new JpaTransactionManager();
    jtm.setEntityManagerFactory(emf);
    return jtm;
}

И пусть Spring определит EntityManagerFactory для передачи.

Соблюдение правильной конфигурации в этой статье: https://docs.spring.io/spring-data/jpa/docs/1.11.13.RELEASE/reference/html/#repositories.create-instances.java-config

0 голосов
/ 23 июня 2018

Ваша проблема из-за неправильной конфигурации, HibernateJpaVendorAdapter не состоит в контексте Spring, поэтому вы должны объявить ее как Spring Bean, пример приведен ниже:

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
    em.setDataSource(dataSource);
    em.setPackagesToScan(new String[] { "property.entity" });
    em.setJpaVendorAdapter(vendorAdapter());
    em.setJpaProperties(additionalProperties());
    return em;
}

@Bean
public JpaVendorAdapter vendorAdapter(){
    return new HibernateJpaVendorAdapter();
}
...