Наличие `java.lang.StackOverflowError: null` при запуске метода Jpa findById (Long id) на конкретном объекте с двунаправленным соединением - PullRequest
0 голосов
/ 19 ноября 2018

У меня проблема с методом findById Jpa для определенного объекта (CtThhlastikaPressThreats).
Чтобы прояснить подробнее о проекте, он использует Spring Boot, Jpa и MySQL.
Существуют сущности с двунаправленными соединениями @OneToMany и @ManyToOne, в то время как между ними есть mappedBy и JoinColumn.

Определенный объект, для которого я сталкиваюсь с проблемой, имеет двунаправленное соединение, подобное объекту DeigmaThhlastikwn (с которым нет проблем, я однажды столкнулся с исключением StackOverflow, но оно было решено с аннотацией @JsonIgnore Я попробовал это на этом, а также вы можете видеть на стороне @ManyToOne 1013 * Entity, но это не сработало)

CtThhlastikaPressThreatsController Контроллер покоя:

@RestController
@RequestMapping(CtThhlastikaPressThreatsController.BASE_URL)
public class CtThhlastikaPressThreatsController {

public static final String BASE_URL = "/v1/ctThhlastikaPressThreats";

private CtThhlastikaPressThreatsService ctThhlastikaPressThreatsService;

@Autowired
private CtThhlastikaPressThreatsRepositoryImpl ctThhlastikaPressThreatsRepository;

public CtThhlastikaPressThreatsController(CtThhlastikaPressThreatsService ctThhlastikaPressThreatsService) {
    this.ctThhlastikaPressThreatsService = ctThhlastikaPressThreatsService;
}

@CrossOrigin
@GetMapping({"/{id}"})
public CtThhlastikaPressThreats findById(@PathVariable Long id){
    return ctThhlastikaPressThreatsRepository.findCtThhlastikaPressThreatsById(id);
}

@CrossOrigin
@PostMapping()
public CtThhlastikaPressThreats addPressThreat(@RequestBody CtThhlastikaPressThreatDTO ctThhlastikaPressThreatDTO){
    try {
        return ctThhlastikaPressThreatsService.addPressThreat(ctThhlastikaPressThreatDTO);
    }catch (Exception e){
        throw e;
    }
}

@CrossOrigin
@GetMapping({"/getAllActCodes"})
public ArrayList<String> getAllActCodes(){
    try {
        return ctThhlastikaPressThreatsService.getAllActCodes();
    }catch (Exception e){
        throw e;
    }
}
}


CtThhlastikaPressThreats Сущность:

package com.teicm.kerkinibackend.domain;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

@Entity
public class CtThhlastikaPressThreats {

@Id
@Column(name = "id", nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "ctThhlastikaPressThreats")
private Set<DeigmaThhlastikwnXPressThreats> deigmaThhlastikwnXPressThreatsSet = new HashSet<>();

@Column(name = "act_code", unique = true, length = 50)
private String actCode;

@Column(name = "description_en")
private String descriptionEn;

@Column(name = "remarks")
private String remarks;

public CtThhlastikaPressThreats addPressThreat(DeigmaThhlastikwnXPressThreats deigmaThhlastikwnXPressThreats){
    deigmaThhlastikwnXPressThreats.setCtThhlastikaPressThreats(this);
    this.deigmaThhlastikwnXPressThreatsSet.add(deigmaThhlastikwnXPressThreats);
    return this;
}

public CtThhlastikaPressThreats() {
}

public CtThhlastikaPressThreats(String actCode, Set<DeigmaThhlastikwnXPressThreats> deigmaThhlastikwnXPressThreatsSet, String descriptionEn, String remarks) {
    this.actCode = actCode;
    this.deigmaThhlastikwnXPressThreatsSet = deigmaThhlastikwnXPressThreatsSet;
    this.descriptionEn = descriptionEn;
    this.remarks = remarks;
}

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getActCode() {
    return actCode;
}

public void setActCode(String actCode) {
    this.actCode = actCode;
}

public Set<DeigmaThhlastikwnXPressThreats> getDeigmaThhlastikwnXPressThreatsSet() {
    return deigmaThhlastikwnXPressThreatsSet;
}

public void setDeigmaThhlastikwnXPressThreatsSet(Set<DeigmaThhlastikwnXPressThreats> deigmaThhlastikwnXPressThreatsSet) {
    this.deigmaThhlastikwnXPressThreatsSet = deigmaThhlastikwnXPressThreatsSet;
}

public String getDescriptionEn() {
    return descriptionEn;
}

public void setDescriptionEn(String descriptionEn) {
    this.descriptionEn = descriptionEn;
}

public String getRemarks() {
    return remarks;
}

public void setRemarks(String remarks) {
    this.remarks = remarks;
}
}


DeigmaThhlastikwnXPressThreats Сущность:

package com.teicm.kerkinibackend.domain;

import com.fasterxml.jackson.annotation.JsonIgnore;

import javax.persistence.*;

@Entity
public class DeigmaThhlastikwnXPressThreats {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "deigma_thhlastikwn_id")
@JsonIgnore
private DeigmaThhlastikwn deigmaThhlastikwn;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "ct_thhlastika_press_threats_id")
@JsonIgnore
private CtThhlastikaPressThreats ctThhlastikaPressThreats;

@Column(name = "kwdikos_eidous", length = 50)
private String kwdikosEidous;

@Column(name = "press_threat", length = 50)
private String pressThreat;

@Column(name = "importance", length = 50)
private String importance;

public DeigmaThhlastikwnXPressThreats() {
}

public DeigmaThhlastikwnXPressThreats(DeigmaThhlastikwn deigmaThhlastikwn, CtThhlastikaPressThreats ctThhlastikaPressThreats, String kwdikosEidous, String pressThreat, String importance) {
    this.deigmaThhlastikwn = deigmaThhlastikwn;
    this.ctThhlastikaPressThreats = ctThhlastikaPressThreats;
    this.kwdikosEidous = kwdikosEidous;
    this.pressThreat = pressThreat;
    this.importance = importance;
}

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public DeigmaThhlastikwn getDeigmaThhlastikwn() {
    return deigmaThhlastikwn;
}

public void setDeigmaThhlastikwn(DeigmaThhlastikwn deigmaThhlastikwn) {
    this.deigmaThhlastikwn = deigmaThhlastikwn;
}

public CtThhlastikaPressThreats getCtThhlastikaPressThreats() {
    return ctThhlastikaPressThreats;
}

public void setCtThhlastikaPressThreats(CtThhlastikaPressThreats ctThhlastikaPressThreats) {
    this.ctThhlastikaPressThreats = ctThhlastikaPressThreats;
}

public String getKwdikosEidous() {
    return kwdikosEidous;
}

public void setKwdikosEidous(String kwdikosEidous) {
    this.kwdikosEidous = kwdikosEidous;
}

public String getPressThreat() {
    return pressThreat;
}

public void setPressThreat(String pressThreat) {
    this.pressThreat = pressThreat;
}

public String getImportance() {
    return importance;
}

public void setImportance(String importance) {
    this.importance = importance;
}
}


DeigmaThhlastikwn Сущность:

package com.teicm.kerkinibackend.domain;

import javax.persistence.*;
import java.sql.Date;
import java.sql.Time;
import java.util.HashSet;
import java.util.Set;

@Entity
@Table(name = "deigma_thhlastikwn")
public class DeigmaThhlastikwn {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "deigmaThhlastikwn", fetch = FetchType.EAGER)
private Set<DeigmaThhlastikwnXEidh> deigmaThhlastikwnXEidhSet = new HashSet<>();

@OneToMany(cascade = CascadeType.ALL, mappedBy = "deigmaThhlastikwn", fetch = FetchType.EAGER)
private Set<DeigmaThhlastikwnXPressThreats> deigmaThhlastikwnXPressThreatsSet = new HashSet<>();

@Column(name = "kwdikos_deigmatos", nullable = false)
private String kwdikosDeigmatolhpsias;

@Column(name = "xrhmatodothsh")
private String xrhmatodothsh;

@Column(name = "ereunhths")
private String ereunhths;

@Column(name = "topothesia")
private String topothesia;

@Column(name = "date")
private Date date;

@Column(name = "time")
private Time time;

@Column(name = "diarkeia", length = 40)
private String diarkeia;

@Column(name = "tupos_vlasthshs")
private String tuposVlasthshs;

@Column(name = "tupos_oikotopou")
private String tupos_Oikotopou;

@Column(name = "epifaneia_deigmatolhpsias")
private Integer epifaneiaDeigmatolhpsias;

@Column(name = "latitude_egsa")
private Double latitudeEGSA;

@Column(name = "longitude_egsa")
private Double longitudeEGSA;

//    Preferred for Google Maps Markers
@Column(name = "latitude_wgs84")
private Double latitudeWGS84;

//    Preferred for Google Maps Markers
@Column(name = "longitude_wgs84")
private Double longitudeWGS84;

@Column(name = "grid_cell", length = 30)
private String gridCell;

@Column(name = "kwdikos_natura", length = 20)
private String kwdikosNatura;

@Column(name = "methodos_deigmatolhpsias")
private String methodosDeigmatolhpsias;

@Column(name = "parathrhseis")
private String parathrhseis;

@Column(name = "nomos")
private String nomos;

@Column(name = "picture")
@Lob
private Byte picture;

@Column(name = "file")
@Lob
private Byte file;

public DeigmaThhlastikwn() {
}

public DeigmaThhlastikwn(Set<DeigmaThhlastikwnXEidh> deigmaThhlastikwnXEidhSet, Set<DeigmaThhlastikwnXPressThreats> deigmaThhlastikwnXPressThreatsSet, String kwdikosDeigmatolhpsias, String xrhmatodothsh, String ereunhths, String topothesia, Date date, Time time, String diarkeia, String tuposVlasthshs, String tupos_Oikotopou, Integer epifaneiaDeigmatolhpsias, Double latitudeEGSA, Double longitudeEGSA, Double latitudeWGS84, Double longitudeWGS84, String gridCell, String kwdikosNatura, String methodosDeigmatolhpsias, String parathrhseis, String nomos, Byte picture, Byte file) {
    this.deigmaThhlastikwnXEidhSet = deigmaThhlastikwnXEidhSet;
    this.deigmaThhlastikwnXPressThreatsSet = deigmaThhlastikwnXPressThreatsSet;
    this.kwdikosDeigmatolhpsias = kwdikosDeigmatolhpsias;
    this.xrhmatodothsh = xrhmatodothsh;
    this.ereunhths = ereunhths;
    this.topothesia = topothesia;
    this.date = date;
    this.time = time;
    this.diarkeia = diarkeia;
    this.tuposVlasthshs = tuposVlasthshs;
    this.tupos_Oikotopou = tupos_Oikotopou;
    this.epifaneiaDeigmatolhpsias = epifaneiaDeigmatolhpsias;
    this.latitudeEGSA = latitudeEGSA;
    this.longitudeEGSA = longitudeEGSA;
    this.latitudeWGS84 = latitudeWGS84;
    this.longitudeWGS84 = longitudeWGS84;
    this.gridCell = gridCell;
    this.kwdikosNatura = kwdikosNatura;
    this.methodosDeigmatolhpsias = methodosDeigmatolhpsias;
    this.parathrhseis = parathrhseis;
    this.nomos = nomos;
    this.picture = picture;
    this.file = file;
}

// Custom method for adding a new PressThreat for a specific DeigmaThhlastikwn allong with specifying the parent's id in the child object.
public DeigmaThhlastikwn addPressThreat(DeigmaThhlastikwnXPressThreats deigmaThhlastikwnXPressThreats){
    deigmaThhlastikwnXPressThreats.setDeigmaThhlastikwn(this);
    this.deigmaThhlastikwnXPressThreatsSet.add(deigmaThhlastikwnXPressThreats);
    return this;
}

public DeigmaThhlastikwn addXEidh(DeigmaThhlastikwnXEidh deigmaThhlastikwnXEidh){
    deigmaThhlastikwnXEidh.setDeigmaThhlastikwn(this);
    this.deigmaThhlastikwnXEidhSet.add(deigmaThhlastikwnXEidh);
    return this;
}

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public Set<DeigmaThhlastikwnXEidh> getDeigmaThhlastikwnXEidhSet() {
    return deigmaThhlastikwnXEidhSet;
}

public void setDeigmaThhlastikwnXEidhSet(Set<DeigmaThhlastikwnXEidh> deigmaThhlastikwnXEidhSet) {
    this.deigmaThhlastikwnXEidhSet = deigmaThhlastikwnXEidhSet;
}

public Set<DeigmaThhlastikwnXPressThreats> getDeigmaThhlastikwnXPressThreatsSet() {
    return deigmaThhlastikwnXPressThreatsSet;
}

public void setDeigmaThhlastikwnXPressThreatsSet(Set<DeigmaThhlastikwnXPressThreats> deigmaThhlastikwnXPressThreatsSet) {
    this.deigmaThhlastikwnXPressThreatsSet = deigmaThhlastikwnXPressThreatsSet;
}

public String getKwdikosDeigmatolhpsias() {
    return kwdikosDeigmatolhpsias;
}

public void setKwdikosDeigmatolhpsias(String kwdikosDeigmatolhpsias) {
    this.kwdikosDeigmatolhpsias = kwdikosDeigmatolhpsias;
}

public String getXrhmatodothsh() {
    return xrhmatodothsh;
}

public void setXrhmatodothsh(String xrhmatodothsh) {
    this.xrhmatodothsh = xrhmatodothsh;
}

public String getEreunhths() {
    return ereunhths;
}

public void setEreunhths(String ereunhths) {
    this.ereunhths = ereunhths;
}

public String getTopothesia() {
    return topothesia;
}

public void setTopothesia(String topothesia) {
    this.topothesia = topothesia;
}

public Date getDate() {
    return date;
}

public void setDate(Date date) {
    this.date = date;
}

public Time getTime() {
    return time;
}

public void setTime(Time time) {
    this.time = time;
}

public String getDiarkeia() {
    return diarkeia;
}

public void setDiarkeia(String diarkeia) {
    this.diarkeia = diarkeia;
}

public String getTuposVlasthshs() {
    return tuposVlasthshs;
}

public void setTuposVlasthshs(String tuposVlasthshs) {
    this.tuposVlasthshs = tuposVlasthshs;
}

public String getTupos_Oikotopou() {
    return tupos_Oikotopou;
}

public void setTupos_Oikotopou(String tupos_Oikotopou) {
    this.tupos_Oikotopou = tupos_Oikotopou;
}

public Integer getEpifaneiaDeigmatolhpsias() {
    return epifaneiaDeigmatolhpsias;
}

public void setEpifaneiaDeigmatolhpsias(Integer epifaneiaDeigmatolhpsias) {
    this.epifaneiaDeigmatolhpsias = epifaneiaDeigmatolhpsias;
}

public Double getLatitudeEGSA() {
    return latitudeEGSA;
}

public void setLatitudeEGSA(Double latitudeEGSA) {
    this.latitudeEGSA = latitudeEGSA;
}

public Double getLongitudeEGSA() {
    return longitudeEGSA;
}

public void setLongitudeEGSA(Double longitudeEGSA) {
    this.longitudeEGSA = longitudeEGSA;
}

public Double getLatitudeWGS84() {
    return latitudeWGS84;
}

public void setLatitudeWGS84(Double latitudeWGS84) {
    this.latitudeWGS84 = latitudeWGS84;
}

public Double getLongitudeWGS84() {
    return longitudeWGS84;
}

public void setLongitudeWGS84(Double longitudeWGS84) {
    this.longitudeWGS84 = longitudeWGS84;
}

public String getGridCell() {
    return gridCell;
}

public void setGridCell(String gridCell) {
    this.gridCell = gridCell;
}

public String getKwdikosNatura() {
    return kwdikosNatura;
}

public void setKwdikosNatura(String kwdikosNatura) {
    this.kwdikosNatura = kwdikosNatura;
}

public String getMethodosDeigmatolhpsias() {
    return methodosDeigmatolhpsias;
}

public void setMethodosDeigmatolhpsias(String methodosDeigmatolhpsias) {
    this.methodosDeigmatolhpsias = methodosDeigmatolhpsias;
}

public String getParathrhseis() {
    return parathrhseis;
}

public void setParathrhseis(String parathrhseis) {
    this.parathrhseis = parathrhseis;
}

public String getNomos() {
    return nomos;
}

public void setNomos(String nomos) {
    this.nomos = nomos;
}

public Byte getPicture() {
    return picture;
}

public void setPicture(Byte picture) {
    this.picture = picture;
}

public Byte getFile() {
    return file;
}

public void setFile(Byte file) {
    this.file = file;
}
}


Просто чтобы сообщить, добавление нового CtThhlastikaPressThreats успешно завершено. Также схема MySQL создается автоматически на Run.


Страница проекта github находится на https://github.com/alexgil1994/kerkinibackend



Трассировка ошибки в стеке (и она остается неизменной, я не вставил весь стек, потому что вы уже можете видеть, что он повторяется):

2018-11-19 21:59:48.808 ERROR 1372 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.StackOverflowError] with root cause

java.lang.StackOverflowError: null
at org.springframework.data.repository.util.ClassUtils.unwrapReflectionException(ClassUtils.java:154) ~[spring-data-commons-2.1.1.RELEASE.jar:2.1.1.RELEASE]
at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:646) ~[spring-data-commons-2.1.1.RELEASE.jar:2.1.1.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:608) ~[spring-data-commons-2.1.1.RELEASE.jar:2.1.1.RELEASE]
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.lambda$invoke$3(RepositoryFactorySupport.java:595) ~[spring-data-commons-2.1.1.RELEASE.jar:2.1.1.RELEASE]
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:595) ~[spring-data-commons-2.1.1.RELEASE.jar:2.1.1.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:59) ~[spring-data-commons-2.1.1.RELEASE.jar:2.1.1.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294) ~[spring-tx-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98) ~[spring-tx-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139) ~[spring-tx-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:117) ~[spring-data-jpa-2.1.1.RELEASE.jar:2.1.1.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:61) ~[spring-data-commons-2.1.1.RELEASE.jar:2.1.1.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at com.sun.proxy.$Proxy112.findCtThhlastikaPressThreatsById(Unknown Source) ~[na:na]
at sun.reflect.GeneratedMethodAccessor63.invoke(Unknown Source) ~[na:na]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_181]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_181]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:206) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at com.sun.proxy.$Proxy94.findCtThhlastikaPressThreatsById(Unknown Source) ~[na:na]
at com.teicm.kerkinibackend.repositories.CtThhlastikaPressThreatsRepositoryImpl.findCtThhlastikaPressThreatsById(CtThhlastikaPressThreatsRepositoryImpl.java:37) ~[classes/:na]
at com.teicm.kerkinibackend.repositories.CtThhlastikaPressThreatsRepositoryImpl$$FastClassBySpringCGLIB$$f23e415a.invoke(<generated>) ~[classes/:na]
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:746) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139) ~[spring-tx-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at com.teicm.kerkinibackend.repositories.CtThhlastikaPressThreatsRepositoryImpl$$EnhancerBySpringCGLIB$$b6491b5e.findCtThhlastikaPressThreatsById(<generated>) ~[classes/:na]
at sun.reflect.GeneratedMethodAccessor64.invoke(Unknown Source) ~[na:na]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_181]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_181]
at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:359) ~[spring-data-commons-2.1.1.RELEASE.jar:2.1.1.RELEASE]
at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:200) ~[spring-data-commons-2.1.1.RELEASE.jar:2.1.1.RELEASE]
at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:644) ~[spring-data-commons-2.1.1.RELEASE.jar:2.1.1.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:608) ~[spring-data-commons-2.1.1.RELEASE.jar:2.1.1.RELEASE]
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.lambda$invoke$3(RepositoryFactorySupport.java:595) ~[spring-data-commons-2.1.1.RELEASE.jar:2.1.1.RELEASE]
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:595) ~[spring-data-commons-2.1.1.RELEASE.jar:2.1.1.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:59) ~[spring-data-commons-2.1.1.RELEASE.jar:2.1.1.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294) ~[spring-tx-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98) ~[spring-tx-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139) ~[spring-tx-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:117) ~[spring-data-jpa-2.1.1.RELEASE.jar:2.1.1.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:61) ~[spring-data-commons-2.1.1.RELEASE.jar:2.1.1.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at com.sun.proxy.$Proxy112.findCtThhlastikaPressThreatsById(Unknown Source) ~[na:na]
at sun.reflect.GeneratedMethodAccessor63.invoke(Unknown Source) ~[na:na]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_181]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_181]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:206) ~[spring-aop-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at com.sun.proxy.$Proxy94.findCtThhlastikaPressThreatsById(Unknown Source) ~[na:na]
at com.teicm.kerkinibackend.repositories.CtThhlastikaPressThreatsRepositoryImpl.findCtThhlastikaPressThreatsById(CtThhlastikaPressThreatsRepositoryImpl.java:37) ~[classes/:na]


Я прошу прощения за любые неправильные действия, проект находится на ранней стадии моей диссертации.

Любая помощь очень ценится.


Обновление - решено:


После следования предложениям в ответах проблема была решена. Более подробное объяснение в разделе «Правильный ответ» содержится в одном из моих комментариев.
Также, если кому-то интересно увидеть все изменения с подробностями, вы можете посмотреть коммит, который решил проблему:
https://github.com/alexgil1994/kerkinibackend/commit/230c1df96623363c61317216913b310c1c7ec231

1 Ответ

0 голосов
/ 20 ноября 2018

Я бы начал с добавления следующего в ваш файл application.properties, чтобы вы могли точно знать, как называются операторы sql.

# Log sql statements and their parameters
logging.level.org.hibernate.SQL=debug
logging.level.org.hibernate.type.descriptor.sql=trace

@ JsonIgnore не поможет с чтением данных.Это происходит только тогда, когда вы используете Джексона для преобразования объектов в Json.т.е. когда вы возвращаете данные из RestController.

Я только что посмотрел на метод ctThhlastikaPressThreatsRepository.findCtThhlastikaPressThreatsById в репозитории на github.Похоже, что он вызывает сам себя, что приведет к переполнению стека.

public CtThhlastikaPressThreats findCtThhlastikaPressThreatsById(Long id){
    try {
        // TODO: 11/17/2018 !!! -- Try as an Optional findById(id) instead!!!
        return ctThhlastikaPressThreatsRepository.findCtThhlastikaPressThreatsById(id);
    }catch (Exception e){
        throw  e;
    }
}

Очень сбивает с толку, как вы используете spring и jpa.Я бы либо использовал ваш собственный @Repository (у вас версия Impl), либо воспользовался расширением CrudRepository.Не пытайтесь делать и то и другое.

Если вы хотите использовать CrudRepository, все, что вам нужно, это иметь что-то похожее на то, что у вас уже есть.

public interface CtThhlastikaPressThreatsRepository extends CrudRepository<CtThhlastikaPressThreats, Long>, org.springframework.data.repository.Repository<CtThhlastikaPressThreats, Long> {

    Optional<CtThhlastikaPressThreats> findById(Long id);

    CtThhlastikaPressThreats findCtThhlastikaPressThreatsById(Long id);

    @Query(nativeQuery = true, value = "SELECT DISTINCT ct.act_code FROM ct_thhlastika_press_threats ct ORDER BY act_code ASC")
    ArrayList<String> findDistinctByActCodeOrderByActCode();
}

Вы сможете удалитьImpl version и просто используйте это.

Я бы посоветовал вам написать несколько тестовых классов, чтобы упростить отладку.

например,

@RunWith(SpringJUnit4ClassRunner.class)
@DataJpaTest
public class CtThhlastikaPressThreatsRepositoryImplTest {

    @Autowired
    private CtThhlastikaPressThreatsRepository ctThhlastikaPressThreatsRepository;

    @Test
    public void findByIdTest() {
        CtThhlastikaPressThreats pressThreats = new CtThhlastikaPressThreats();
        pressThreats.setActCode("actcode");
        pressThreats.setDescriptionEn("description");
        pressThreats.setRemarks("remarks");
        ctThhlastikaPressThreatsRepository.save(pressThreats);

        CtThhlastikaPressThreats found = ctThhlastikaPressThreatsRepository.findById(pressThreats.getId()).orElse(null);
        assertEquals("description", found.getDescriptionEn());

        CtThhlastikaPressThreats found2 = ctThhlastikaPressThreatsRepository.findCtThhlastikaPressThreatsById(pressThreats.getId());
        assertEquals("description", found2.getDescriptionEn());
    }

    @Test
    public void listCodesTest() {
        CtThhlastikaPressThreats pressThreats = new CtThhlastikaPressThreats();
        pressThreats.setActCode("actcode1");
        pressThreats.setDescriptionEn("description1");
        pressThreats.setRemarks("remarks1");
        ctThhlastikaPressThreatsRepository.save(pressThreats);
        pressThreats = new CtThhlastikaPressThreats();
        pressThreats.setActCode("actcode2");
        pressThreats.setDescriptionEn("description2");
        pressThreats.setRemarks("remarks2");
        ctThhlastikaPressThreatsRepository.save(pressThreats);
        List<String> expected = Arrays.asList(new String[] {"actcode1", "actcode2"});

        ArrayList<String> found = ctThhlastikaPressThreatsRepository.findDistinctByActCodeOrderByActCode();
        assertTrue(found.containsAll(expected) && expected.containsAll(found));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...