Я создал простую модель данных из 3 сущностей, и при попытке сохранить данные она не работает. Вот сущности и их классы идентификаторов, сервер:
@Entity
@Data
public class Server {
@Id
private String name;
private String serverUrl;
@OneToMany(mappedBy = "server", fetch = FetchType.LAZY)
private List<Service> services;
}
Служба:
@Entity
@IdClass(ServiceId.class)
public class Service {
@Id
private String name;
@Id
@ManyToOne(fetch = FetchType.LAZY)
private Server server;
@OneToMany(mappedBy = "service", fetch = FetchType.EAGER)
private List<Container> containers;
}
public class ServiceId implements Serializable {
private String name;
private Server server;
}
Контейнер:
@Entity
@IdClass(ContainerId.class)
public class Container {
@Id
private String name;
@Id
@ManyToOne(fetch = FetchType.LAZY)
private Service service;
private String command;
private String state;
private String ports;
}
@Data
public class ContainerId implements Serializable {
private String name;
private Service service;
}
Что я пытаюсь сделать, это использовать ServiceRepository:
public interface ServiceRepository extends JpaRepository<Service, ServiceId> {
}
для сохранения объекта службы:
public class SomeClass{
@Autowired
ServiceRepository serviceRepository;
@Transactional
public void insertServices(Service service) {
serviceRepository.save(service); <- Exception HERE!
}
}
Объект службы содержит сервер, который уже находится в базе данных в таблице серверов, сам сервис, которого нет в базе данныхеще и список контейнеров, которых еще нет в БД (и которые также должны быть постоянными сейчас). Ошибка, которую я получаю при этом:
org.springframework.beans.ConversionNotSupportedException: не удалось преобразовать значение свойства типа 'java.lang.String' в требуемый тип 'a.servers.Server'для свойства 'сервер';Вложенное исключение - java.lang.IllegalStateException: невозможно преобразовать значение типа «java.lang.String» в требуемый тип «a.servers.Server» для свойства «server»: в org.springframework.beans не найдено подходящих редакторов или стратегии преобразования. ,spring-beans-5.2.0.RELEASE.jar: 5.2.0.RELEASE] в org.springframework.beans.AbstractNestablePropertyAccessor.processLocalProperty (AbstractNestablePropertyAccessor.java:453) ~ [spring-beans-5.2.0.RELEASE.jar: 5.2.0.RELEASE] в org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue (AbstractNestablePropertyAccessor.java:278) ~ [spring-beans-5.2.0.RELEASE.jar: 5.2.0.RELEASE] в org.springfProtableA.setPropertyValue (AbstractNestablePropertyAccessor.java:246) ~ [spring-beans-5.2.0.RELEASE.jar: 5.2.0.RELEASE] в org.springframework.data.util.DirectFieldAccessFallbackBeanWrapper.setPropertyValue (DirectFieldAccessFallbackBeanWrapper.java:75 ~ [spring]-commons-2.2.0.RELEASE.jar: 2.2.0.RELEASE] по адресу org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation $ IdentifierDerivingDirectFieldAccessFallbackBeanWrapper.setPropertyValue (jpa ~ -entityIntation.-data] -etation) -Data.Intel.jar2.2.0.RELEASE.jar: 2.2.0.RELEASE] at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.getId (JpaMetamodelEntityInformation.java:166) ~ [spring-data-jpa-2.2.0.RELE.jar: 2.2.0.RELEASE] at org.springframework.data.repository.core.support.AbstractEntityInformation.isNew (AbstractEntityInformation.java:42) ~ [spring-data-commons-2.2.0.RELEASE.jar: 2.2. 0.RELEASE] at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.isNew (JpaMetamodelEntityInformation.java:237) ~ [spring-data-jpa-2.2. 0.RELEASE.jar: 2.2.0.RELEASE] at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save (SimpleJpaRepository.java:553) ~ [spring-data-jpa-2.2.0.RELEASE.jar: 2.2.0.RELEASE] at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) ~ [na: 1.8.0_172] at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62_17) ~ [na] 1.8.017at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) ~ [na: 1.8.0_172] at java.lang.reflect.Method.invoke (Method.java:498) ~ [na: 1.8.0_172] в организации.springframework.data.repository.core.support.RepositoryComposition $ RepositoryFragments.invoke (RepositoryComposition.java:371) ~ [spring-data-commons-2.2.0.RELEASE.jar: 2.2.0.RELEASE] в org.springframework. data.repository.core.support.RepositoryComposition.invoke (RepositoryComposition.java:204) ~ [spring-data-commons-2.2.0.RELEASE.jar: 2.2.0.RELEASE]at org.springframework.data.repository.core.support.RepositoryFactorySupport $ ImplementMethodExecutionInterceptor.invoke (RepositoryFactorySupport.java:657) ~ [spring-data-commons-2.2.0.RELEASE.jar: 2.2.0] atREL. springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:186) ~ [spring-aop-5.2.0.RELEASE.jar: 5.2.0.RELEASE] в org.springframework.data.repository.Suppsupport.Core$ QueryExecutorMethodInterceptor.doInvoke (RepositoryFactorySupport.java:621) ~ [spring-data-commons-2.2.0.RELEASE.jar: 2.2.0.RELEASE] в org.springframework.data.repository.core.support.Repositoryorthoserinvoke (RepositoryFactorySupport.java:605) ~ [spring-data-commons-2.2.0.RELEASE.jar: 2.2.0.RELEASE] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation). [spring-aop-5.2.0.RELEASE.jar: 5.2.0.RELEASE] в org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke (DefaultMethodInvokingMethodInterceptor.java:80) ~ [spring-data-commons-2.2.0.RELEASE.jar: 2.2.0.RELEASE] по адресу org.springframework.aop.framework.ReflectiveMethodInvocation.ocetinhoj) ~ [spring-aop-5.2.0.RELEASE.jar: 5.2.0.RELEASE] в org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction (TransactionAspectSupport.java:353) ~ [spring-tx-5.2.0. RELEASE.jar: 5.2.0.RELEASE] в org.springframework.transaction.interceptor.TransactionInterceptor.invoke (TransactionInterceptor.java:99) ~ [spring-tx-5.2.0.RELEASE.jar: 5.2.0.RELEASE] вorg.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:186) ~ [spring-aop-5.2.0.RELEASE.jar: 5.2.0.RELEASE] в org.springframework.dao.InkeorSransport.Pозначение получения(PersistenceExceptionTranslationInterceptor.java:139) ~ [spring-tx-5.2.0.RELEASE.jar: 5.2.0.RELEASE] в org.springframework.aop.framework.ReflectiveMethodInvocation. .java: 178) ~ [spring-data-jpa-2.2.0.RELEASE.jar: 2.2.0.RELEASE] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:186) ~ [spring-aop-5.2.0.RELEASE.jar: 5.2.0.RELEASE] at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke (ExposeInvocationInterceptor.java:93) ~ [spring-aop-5.2.0.RELEASE.jar: 5.2.0.RELEASE] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:186) ~ [spring-aop-5.2.0.RELEASE.jar: 5.2.0.RELEASE] в org.springframe.framework.JdkDynamicAopProxy.invoke (JdkDynamicAopProxy.java:212) ~ [spring-aop-5.2.0.RELEASE.jar: 5.2.0.RELEASE] в com.sun.proxy. $ Proxy96.save (Неизвестный источник) ~ [na: na] в a.services.ServiceService.updateServices (ServiceService.java:20) ~ [classes /: na] в a.services.ServiceService $$ FastClassBySpringCGLIB $$ 7cf24811.invoke () ~ [classes /: na] в org.springframework.cgli. .MethodProxy.invoke (MethodProxy.java:218) ~ [spring-core-5.2.0.RELEASE.jar: 5.2.0.RELEASE] в org.springframework.aop.framework.CglibAopProxy $ CglibMethodInvocation.invokeJobopPro: (769) ~ [spring-aop-5.2.0.RELEASE.jar: 5.2.0.RELEASE] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:163) ~ [spring-aop-5.2.0.RELEASE.jar: 5.2.0.RELEASE] at org.springframework.aop.framework.CglibAopProxy $ CglibMethodInvocation.proceed (CglibAopProxy.java:747) ~ [spring-aop-5.2.0.RELEASE.jar: 5.2.0. ВЫПУСК]в org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction (TransactionAspectSupport.java:353) ~ [spring-tx-5.2.0.RELEASE.jar: 5.2.0.RELEASE] в org.springframework.toractionInceptor. invoke (TransactionInterceptor.java:99) ~ [spring-tx-5.2.0.RELEASE.jar: 5.2.0.RELEASE] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:186 ~ [spring]-aop-5.2.0.RELEASE.jar: 5.2.0.RELEASE] в org.springframework.aop.framework.CglibAopProxy $ CglibMethodInvocation.proceed (CglibAopProxy.java:747) ~ [spring-aop-5.2.0.RELE. jar: 5.2.0.RELEASE] в org.springframework.aop.framework.CglibAopProxy $ DynamicAdvisedInterceptor.intercept (CglibAopProxy.java:689) ~ [spring-aop-5.2.0.RELEASE.jar: 5.2.0.RELEASE] вa.services.ServiceService $$ EnhancerBySpringCGLIB $$ a987bcb2.updateServices () ~ [classes /: na] в a.agents.DataFetcher.fetch (DataFetcher.java:48) ~ [classes /: na] в sun.reflect.NativeMetmplccessor.invoke0(Собственный метод) ~ [na: 1.8.0_172] в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) ~ [na: 1.8.0_172] в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegationMet)~ [na: 1.8.0_172] в java.lang.reflect.Method.invoke (Method.java:498) ~ [na: 1.8.0_172] в org.springframework.scheduling.support.ScheduledMethodRunnable.run (ScheduledMethodRunnable.java:84) ~ [spring-context-5.2.0.RELEASE.jar: 5.2.0.RELEASE] в org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run (DelegatingErrorHandlingRunnable.java:54) ~ [spring-context-5.2.0.RELEASE.jar: 5.2.0.RELEASE] в org.springframework.scheduling.concurrent.ReschedulingRunnable.run (ReschedulingRunnable.java:93) [spring-context-5.2.0.RELEASE.jar: 5.2.0.RELEASE] вjava.util.concurrent.Executors $ RunnableAdapter.call (Executors.java:511) [na: 1.8.0_172] в java.util.concurrent.FutureTask.run $$$ capture (FutureTask.java:266) [na: 1.8.0_172] на java.util.concurrent.FutureTask.run (FutureTask.java) [na: 1.8.0_172] в java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 201 (ScheduledThreadPoolExecutor.java:180) [na: 1.8.0_172] в java.util.concurrent.ScheduledThreadSecutorFecutor.java: 293) [na: 1.8.0_172] в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1149) [na: 1.8.0_172] в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPo.java: 624) [na: 1.8.0_172] в java.lang.Thread.run (Thread.java:748) [na: 1.8.0_172] Причина: java.lang.IllegalStateException: Невозможно преобразовать значение типа 'java.lang.String 'в обязательный тип' a.servers.Server 'для свойства' server ': не найдено подходящих редакторов или стратегии преобразования в org.springframework.beans.TypeConverterDelegate.convertIfNeeded (TypeConverterDelegate.java:262) ~ [spring-beans-5.2.0.RELEASE.jar: 5.2.0.RELEASE] at org.springframework.beans.AbstractNestablePropertyAccessor.convertIfNeeded (AbstractNestablePropertyAccessor. java: 585) ~ [spring-beans-5.2.0.RELEASE.jar: 5.2.0.RELEASE] ... 62 общих кадра опущено
у меня есть весна -> jpa -> show-sql установлен в true в application.yml, поэтому я получаю этот журнал до его сбоя:
Hibernate: выберите server0_.name в качестве имени1_1_, server0_.server_url в качестве server_u2_1_ с сервера server0_
Созданная БД выглядит нормально: