У меня есть 4 класса, связанных друг с другом, как вы видите ниже в проекте Spring Boot.
Когда я сохраняю объект thread через ThreadRepository, проблем не возникает.Автоматически List<Tweet> listOfTweets
Все Tweet
объекты в списке сохраняются в базе данных.Когда я хочу получить все твиты в таблице твитов , я вижу такую ошибку в браузере.(часть вывода) Я имею в виду, нет проблемы, когда вы хотите сохранить их в базе данных, но если вы хотите получить их, есть проблема.
java.lang.IllegalArgumentException: не можетустановите для поля java.lang.String com.savetweet.tweet.domain.Tweet.tweet_id значение java.lang.Long
Ошибка доступа к полю [private java.lang.String com.savetweet.tweet.domain.Tweet.tweet_id] отражением для постоянного свойства [com.savetweet.tweet.domain.Tweet # tweet_id]: 1;вложенным исключением является org.hibernate.property.access.spi.PropertyAccessException: ошибка при доступе к полю [private java.lang.String com.savetweet.tweet.domain.Tweet.tweet_id] отражением для постоянного свойства [com.savetweet.tweet.domain.Tweet # tweet_id]: 1
tweet_id
уже имеет тип String.Но я не знаю, почему он хочет изменить тип Long.
Процесс базы данных, выполняемый через интерфейс Tweet / Thread / Media / LinkRepository: (т.е.)
@Repository
public interface TweetRepository extends JpaRepository<Tweet,Long> {
}
TweetServiceImp:
@Service
public class TweetServiceImp implements TweetService {
private final static Logger log = LoggerFactory.getLogger(TweetServiceImp.class);
private final TweetRepository tweetRepository;
public TweetServiceImp(TweetRepository tweetRepository) {
this.tweetRepository = tweetRepository;
}
@Override
public List<Tweet> findAllTweets() {
return tweetRepository.findAll();
}
}
Контроллер:
@Controller
public class SerieController {
private final TweetService tweetService;
private final ThreadService threadService;
public SerieController(TweetService tweetService, ThreadService threadService) {
this.tweetService = tweetService;
this.threadService = threadService;
}
@RequestMapping(value = "/series/allTweets")
@ResponseBody
public List<Tweet> getAllTweets(){
return tweetService.findAllTweets();
}
}
Тема сущности:
@Entity
@Table(name = "tbl_thread")
@Getter @Setter @ToString
public class Thread implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(unique = true,name = "thread_id")
private String threadId;
@Transient
private Tweet mainTweet;
@OneToMany(mappedBy = "thread",cascade = CascadeType.ALL)
private List<Tweet> listOfTweets = new ArrayList<Tweet>();
Tweet сущность:
@Entity
@Table(name = "tbl_tweet")
@Getter @Setter @ToString
public class Tweet implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private long id;
@Column(unique = true, nullable = false,name = "tweet_id")
private String tweet_id;
@Column(name = "parent_tweet_id")
private String parentTweetID;
@Column(name = "avatar")
private String avatar;
@Column(name = "owner_id")
private long owner_id;
@Column(name = "owner_name")
private String owner_name;
@Column(name = "owner_nick")
private String owner_nick;
@Column(name = "content")
private String content;
@Column(name = "sent_time")
private String sent_time;
@Column(name = "sent_date")
private String sent_date;
@Column(name = "retweet_count")
private String retweet_count;
@Column(name = "like_count")
private String like_count;
@Transient
private String quotedTweetHtml;
@ManyToOne
@JoinColumn(name = "thread_id",referencedColumnName = "thread_id")
private Thread thread = new Thread();
@OneToMany(mappedBy = "tweet",cascade = CascadeType.ALL)
private List<Media> mediaURLs = new ArrayList<Media>();
@OneToOne(mappedBy = "tweet",cascade = CascadeType.ALL )
private Link link;
Ссылка сущности:
@Entity
@Getter @Setter @ToString
public class Link implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private long id;
@Column(name = "attachment_type")
private String attachmentType;
@Column(name = "title")
private String title;
@Column(name = "description")
private String description;
@Column(name = "image")
private String image;
@Column(name = "url")
private String url;
@Column(name = "type")
private String type;
@Column(name = "video_url")
private String videoUrl;
@Column(name = "video_secure_url")
private String videoSecureUrl;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "tweet_id",referencedColumnName = "tweet_id")
private Tweet tweet;
Медиа сущность:
@Entity
@Table(name = "tbl_media")
@Getter @Setter @ToString
public class Media implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = "media_id")
private String mediaID;
@Column(name = "media_type")
private String mediaType;
@Column(name = "media_url")
private String mediaUrl;
@Column(name = "media_url_https")
private String mediaUrlHttps;
@Column(name = "media_video_url")
private String mediaVideoUrl;
@ManyToOne
@JoinColumn(name = "tweet_id",referencedColumnName = "tweet_id")
private Tweet tweet;
Полный вывод:
Произошла непредвиденная ошибка (тип = Внутренняя ошибка сервера, статус = 500).Ошибка доступа к полю [private java.lang.String com.savetweet.tweet.domain.Tweet.tweet_id] из-за отражения постоянного свойства [com.savetweet.tweet.domain.Tweet # tweet_id]: 1;вложенным исключением является org.hibernate.property.access.spi.PropertyAccessException: ошибка при доступе к полю [private java.lang.String com.savetweet.tweet.domain.Tweet.tweet_id] отражением для постоянного свойства [com.savetweet.tweet.domain.Tweet # tweet_id]: 1 org.springframework.orm.jpa.JpaSystemException: Ошибка при доступе к полю [private java.lang.String com.savetweet.tweet.domain.Tweet.tweet_id] отражением для постоянного свойства [com.savetweet.tweet.domain.Tweet # tweet_id]: 1;вложенным исключением является org.hibernate.property.access.spi.PropertyAccessException: ошибка при доступе к полю [private java.lang.String com.savetweet.tweet.domain.Tweet.tweet_id] отражением для постоянного свойства [com.savetweet.tweet.domain.Tweet # tweet_id]: 1 в org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException (HibernateJpaDialect.java:351) в org.springframework.orm.jpa.vendor.HibernateJpaDia.jpgorg.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible (AbstractEntityManagerFactoryBean.java:527) при org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible (ChainedPersistenceExceptionTranslator.java:61) при org.springframework.dao.support.DataAccessUtils.translateIfNecessary (DataAccessUtils.java:242) в org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke (PersistenceExceptionTranslationInterceptor.java:153) в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:186) в org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor $ CrudMethodMetadataPopulatingMethodInterceptor.invoke (CrudMethodMetadataPostProcessor.java:135)в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:186) в org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke (ExposeInvocationInterceptor).в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:186) в org.springframework.data.repository.core.support..ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:186) в org.springframework.aop.framework.JdkDynamicAopProxy.invoke (JdkDynamicAopProxy.java:212) в com.sun.proet.tweet.Service.Imp.TweetServiceImp.findAllTweets (TweetServiceImp.java:68) в com.savetweet.tweet.rest.SerieController.getAllTweets (SerieController.java:40) в java.base / jdk.Собственный метод) в java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) в java.base / jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke.ava.java.jjJava.lang.reflect.Method.invoke (Method.java:564) в org.springframework.web.method.support.InvocableHandlerMethod.doInvoke (InvocableHandlerMethod.java:189) в org.springframeworkvhod.hod.invokeForRequest (InvocableHandlerMethod.java:138) в org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle (ServletInvocableHandlerMethod.jap.m.weg.web.web.web.weg.web.weg.weg.weg.invokeHandlerMethod (RequestMappingHandlerAdapter.java:895) в org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal (RequestMappingHandlerAdapter.java:800.ho.ho.web.web.web (AbstractHandlerMethodAdapter.java:87) в org.springframework.web.servlet.DispatcherServlet.doDispatch (DispatcherServlet.java:1038) в org.springframework.web.servlet.DispatcherServlet.doService (Dispatcher:9).) в org.springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet.java:1005) в org.springframework.web.servlet.FrameworkServlet.doGet (FrameworkServlet.java:897) в javax.erlet.ShletHttpServlet.java:634) в org.springframework.web.servlet.FrameworkServlet.service (FrameworkServlet.java:882) в javax.servlet.http.HttpServlet.service (HttpServlet.java:741ore) в org.cat..ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:231) по адресу org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166) по адресу org.apache.tomcat.websocket.serj.ilf: WFF).doFilterInternal (RequestContextFilter.java:99) в org.springframework.web.filter.OncePerRequestFilter..springframework.web.filter.FormContentFilter.doFilterInternal (FormContentFilter.java:92) при org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:107) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java: 193) в org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166) в org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal (HiddenHttpMethoF)по адресу org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:107) по адресу org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:19acin.FilterCatFat.Cat.Fatter.AjFF)(ApplicationFilterChain.java:166) по адресу org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal (CharacterEncodingFilter.java:200) по адресу org.springframework.web.filter.OncePerRequestFilter.erache.j.catalina.core.199) в org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:96) в org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:490) в org.apache.ostalndc..invoke (StandardHostValve.java:139) в org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:92) в org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.javaap) at).catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:343) в org.apache.coyote.http11.Http11Processor.service (Http11Processor.java:408) в org.apache.coyote.AbstractProcessorLight.proight) в org.apache.coyote.AbstractProtocol $ ConnectionHandler.process (AbstractProtocol.java:834) в org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun (NioEndpoint.java:1417) в org.apache.tomcat.util.net.SocketProcessorBase.run (SocketProcessorBase.java:49) в java.base / java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1167) в java.base / java.util.concurrent.ecutor $.выполнить (ThreadPoolExecutor.java:641) в org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run (TaskThread.java:61) в java.base / java.lang.Thread.run (Thread.java:844) Причина: org.hibernate.property.access.spi.PropertyAccessException: Ошибка при доступе к полю [private java.lang.String com.savetweet.tweet.domain.Tweet.tweet_id] отражением для постоянного свойства[com.savetweet.tweet.domain..java: 59) в org.hibernate.type.ComponentType.getPropertyValue (ComponentType.java:412) в org.hibernate.type.ComponentType.getHashCode (ComponentType.java:239) в org.hibernate.engine.spn.Eity.generateHashCode (EntityUniqueKey.java:67) в org.hibernate.engine.spi.EntityUniqueKey. (EntityUniqueKey.java:48) в org.hibernate.type.EntityType.loadByUniqueKey (EntityType.java:7iber.EntityType.resolve (EntityType.java:467) в org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity (TwoPhaseLoad.java:172) в org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity (TwoPhaseLoad.java:129) в org.hibernate.loader.Loader.initializeEntitiesAndCollections (Loader.java:1151) в org.hibernate.loader.Loader.j1 (0) .Roultв org.hibernate.loader.Loader.doQuery (Loader.java:948) в org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections (Loader.java:340) в org.hibernate.loader.Loader.doList: Loader.java) в org.hibernate.loader.Loader.doList (Loader.java:2672) в org.hibernate.loader.Loader.listIgnoreQueryCache (Loader.java:2506) в org.hibernate.loader.Loader.list (Loader.java:2501) в org.hibernate.loader.hql.QueryLoader.list (QueryLoader.java:504)в org.hibernate.hql.internal.ast.QueryTranslatorImpl.list (QueryTranslatorImpl.java:395) в org.hibernate.engine.query.spi.HQLQueryPlan.performList (HQLQueryPlan.java:220I) в org.hiber.list (SessionImpl.java:1508) в org.hibernate.query.internal.AbstractProducedQuery.doList (AbstractProducedQuery.java:1537) в org.hibernate.query.internal.AbstractProducedQuery.list (AbstractProducedQuery.java:1g5 at или org).hibernate.query.Query.getResultList (Query.java:135) по адресу org.hibernate.query.criteria.internal.compile.CriteriaQueryTypeQueryAdapter.getResultList (CriteriaQueryTypeQueryAdapter.java:74fra.pae.work.pr). org.SimpleJpaRepository.findAll (SimpleJpaRepository.java:306) в org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll (SimpleJpaRepository.java:73) в java.base / jdk.internal.reflect.NativeIemp) в java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) в java.base / jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.base / java.lang.reflect.Method.invoke (Method.java:564).springframework.data.repository.core.support.RepositoryComposition $ RepositoryFragments.invoke (RepositoryComposition.java:359) в org.springframework.data.repository.core.support.RepositoryComposition.invoke (Repository.gomfence.pof)..data.repository.core.support.RepositoryFactorySupport $ внедряемый метод метаданных.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.doInvoke (RepositoryFactorySupport.java:608) по адресу org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecdaava: 595) в org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.invoke (RepositoryFactorySupport.java:595) в org.springframework..springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke (DefaultMethodInvokingMethodInterceptor.java:59) при org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:186) в org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction (TransactionAspectSupport.java: 294) в org.springframework.transaction.interceptor.TransactionInterceptor.invoke (TransactionInterceptor.java:98) в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodIng.support.PersistenceExceptionTranslationInterceptor.invoke (PersistenceExceptionTranslationInterceptor.java:139) ...Еще 65 Причина: java.lang.IllegalArgumentException: Не удается установить поле java.lang.String com.savetweet.tweet.domain.Tweet.tweet_id в java.lang.Long в java.base / jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException (UnsafeFieldAccessorImpl.java:167) в java.base / jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException (UnsafeFieldAccessorImpl.jccessj.jj.в java.base / jdk.internal.reflect.UnsafeObjectFieldAccessorImpl.get (UnsafeObjectFieldAccessorImpl.java:36) в java.base / java.lang.reflect.Field.get (Field.java:418) в org.hibernate.property.spi.GetterFieldImpl.get (GetterFieldImpl.java:71) ... еще 110
Выход Hibernate (с findAllTweets ()):
Hibernate:
select
tweet0_.id as id1_3_,
tweet0_.avatar as avatar2_3_,
tweet0_.content as content3_3_,
tweet0_.like_count as like_cou4_3_,
tweet0_.owner_id as owner_id5_3_,
tweet0_.owner_name as owner_na6_3_,
tweet0_.owner_nick as owner_ni7_3_,
tweet0_.parent_tweet_id as parent_t8_3_,
tweet0_.retweet_count as retweet_9_3_,
tweet0_.sent_date as sent_da10_3_,
tweet0_.sent_time as sent_ti11_3_,
tweet0_.thread_id as thread_13_3_,
tweet0_.tweet_id as tweet_i12_3_
from
tbl_tweet tweet0_
Hibernate:
select
thread0_.id as id1_2_0_,
thread0_.thread_id as thread_i2_2_0_
from
tbl_thread thread0_
where
thread0_.thread_id=?