Я пытаюсь настроить приложение на использование 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)
Я не вижу, что я пропустил.
Скажите, пожалуйста, что я могу сделать, чтобы исправить это и сохранить сущность в хранилище данных?