Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.lang.StackOverflowerr多个:MapStruct-Spring Boot-Hibernate_Java_Hibernate_Spring Boot_Lombok_Mapstruct - Fatal编程技术网

java.lang.StackOverflowerr多个:MapStruct-Spring Boot-Hibernate

java.lang.StackOverflowerr多个:MapStruct-Spring Boot-Hibernate,java,hibernate,spring-boot,lombok,mapstruct,Java,Hibernate,Spring Boot,Lombok,Mapstruct,我正在spring boot上进行api rest,并使用MapStruct进行DTO和实体之间的转换。问题是它在manytomy的关系中启动了一个异常StackOverflowerError。你能帮我吗 行动者实体 @Getter @Setter @NoArgsConstructor @Entity() @Table(name = "Actor") @EqualsAndHashCode(exclude = "films") public class Actor implements Seria

我正在spring boot上进行api rest,并使用MapStruct进行DTO和实体之间的转换。问题是它在manytomy的关系中启动了一个异常StackOverflowerError。你能帮我吗

行动者实体

@Getter @Setter
@NoArgsConstructor
@Entity()
@Table(name = "Actor")
@EqualsAndHashCode(exclude = "films")
public class Actor implements Serializable {

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

    @NotBlank(message = "name is required")
    private String name;

    @ManyToMany(mappedBy = "actors")
    private Set<Film> films;
}

我非常感谢您的帮助

试试这个,实例化这两个属性的HashSet(),您只需要一个方向映射,保留参与者端映射的注释

电影

@Entity@Table(name=“Film”)
@JsonIgnoreProperties({“HibernateLazInitializer”,“handler”})
公共类电影实现可序列化{
@Id@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“Film_id”,updateable=false,nullable=false)
私人长id;
@许多酮
@JoinColumn(name=“Director\u id”)
私人董事;
@ManyToMany(fetch=FetchType.LAZY,
级联={
全部
},
targetEntity=ActorModel.class
)
@JoinTable(name=“Actor\u has\u Film”,
joinColumns={@JoinColumn(name=“Film_id”)},
inverseJoinColumns={@JoinColumn(name=“Actor\u id”)})
@JsonProperty(“参与者”)
私有集actors=newhashset();
public void addActor(Actor){
this.actors.add(actor);
}
}
演员

@Entity()
@表(name=“Actor”)
@JsonIgnoreProperties({“HibernateLazInitializer”,“handler”})
公共类参与者实现了可序列化的{
@Id@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“Actor\u id”,updateable=false,nullable=false)
私人长id;
@NotBlank(message=“name是必需的”)
私有字符串名称;
/*@许多(mappedBy=“actors”)
@杰索尼奥雷
私有集=新的HashSet()*/
}

N+1查询问题,检查查询执行日志当询问与异常相关的问题时,请始终添加原始异常消息和stacktrace!添加了输出日志@dpr问题在于数据结构中存在递归。ActorDTO有一个电影列表,FilmDTO有一个演员列表。我不太喜欢lombok,所以我不能给你一个解决方案,但也许这个提示可以让你自己找到一个解决方案。是的,我知道这是因为FilmDTO和ActorDTO之间的重复问题,但这是数据库中表之间的关系。lombok没有参与异常的原因,我只是把它放在那里,以便您能够理解为什么要使用setter和getter注释。在没有lombok的情况下创建getter、setter和构造函数时,它会抛出相同的异常@dpr
@Getter @Setter
@NoArgsConstructor
@Entity @Table(name = "Film")
@EqualsAndHashCode(exclude = "actors")
public class Film implements Serializable {

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

    @ManyToOne
    @JoinColumn(name = "Director_id")
    private Director director;

    @ManyToMany()
    @JoinTable(
            name = "Actor_has_Film",
            joinColumns = @JoinColumn(name = "Film_id"),
            inverseJoinColumns = @JoinColumn(name = "Actor_id"))
    private Set<Actor> actors;

    public void addActor(Actor actor) {
        this.actors.add(actor);
    }
}
@Getter @Setter
@NoArgsConstructor
public class ActorDTO {

    private Long id;
    private String name;    
    private Set<FilmDTO> films;
}
@Getter @Setter
@NoArgsConstructor
public class FilmDTO {

    private Long id;
    private DirectorDTO director;    
    private Set<ActorDTO> actors;
}
public interface DataMapper<D, E> {
    E toEntity(D dto);
    D toDto(E entity);
    List<E> toEntity(List<D> dtoList);
    List<D> toDto(List<E> entityList);
}
@Mapper(componentModel = "spring", uses = { })
public interface ActorMapper extends DataMapper<ActorDTO, Actor> {
}
@Mapper(componentModel = "spring", uses = { })
public interface FilmMapper extends DataMapper<FilmDTO, Film> {
}
@Service("filmServices")
public class FilmServices implements Services<FilmDTO> {

    @Autowired @Qualifier("filmRepository")
    private FilmRepository filmRepository;

    @Autowired @Qualifier("actorRepository")
    private ActorRepository actorRepository;

    private FilmMapper filmMapper;

    public FilmServices(FilmMapper filmMapper) {
        this.filmMapper = filmMapper;
    }

    public FilmDTO addActorToFilm(Long filmId, Long actoId) {
        Optional<Film> filmByIdOptional = filmRepository.findById(filmId);
        Optional<Actor> actorByIdOptional = actorRepository.findById(actoId);
        FilmDTO filmDtoWithNewActor = null;

        if (!filmByIdOptional.isPresent())
            throw new RuntimeException("The Film with id '" + filmId + "' does not exist");

        if (!actorByIdOptional.isPresent())
            throw new RuntimeException("The Actor with id '" + actoId + "' does not exist");

        Film film = filmByIdOptional.get();
        Actor actorToAdd = actorByIdOptional.get();

        boolean hasActorInFilm = film.getActors().stream()
            .anyMatch(actor -> actor.getName().equals(actorToAdd.getName()));

        if (!hasActorInFilm) {
            film.addActor(actorToAdd);
            Film filmWithNewActor = filmRepository.save(film);
            filmDtoWithNewActor = filmMapper.toDto(filmWithNewActor); // HERE THROW EXCEPTION
        } else {
            throw new RuntimeException("The Actor with id '" + actoId + "' already exist in the film");
        }

        return filmDtoWithNewActor;

    }
}
Hibernate: select films0_.Actor_id as actor_id2_1_0_, films0_.Film_id as film_id1_1_0_, film1_.id as id1_3_1_, film1_.Director_id as director4_3_1_, director2_.id as id1_2_2_ from Actor_has_Film films0_ inner join Film film1_ on films0_.Film_id=film1_.id left outer join Director director2_ on film1_.Director_id=director2_.id where films0_.Actor_id=?
2020-04-07 15:27:26.296 ERROR 742 --- [nio-8080-exec-5] 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 ar.com.ada.sb.relationship.model.mapper.FilmMapperImpl.actorSetToActorDTOSet(FilmMapperImpl.java:188) ~[classes/:na]
    at ar.com.ada.sb.relationship.model.mapper.FilmMapperImpl.toDto(FilmMapperImpl.java:53) ~[classes/:na]
    at ar.com.ada.sb.relationship.model.mapper.FilmMapperImpl.filmSetToFilmDTOSet(FilmMapperImpl.java:165) ~[classes/:na]
    at ar.com.ada.sb.relationship.model.mapper.FilmMapperImpl.actorToActorDTO(FilmMapperImpl.java:182) ~[classes/:na]
    at ar.com.ada.sb.relationship.model.mapper.FilmMapperImpl.actorSetToActorDTOSet(FilmMapperImpl.java:194) ~[classes/:na]
@Entity @Table(name = "Film") 
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Film implements Serializable {

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

    @ManyToOne
    @JoinColumn(name = "Director_id")
    private Director director;

    @ManyToMany(fetch = FetchType.LAZY,
        cascade = {
                CascadeType.ALL
        },
        targetEntity= ActorModel.class
    )
    @JoinTable(name = "Actor_has_Film",
        joinColumns = { @JoinColumn(name = "Film_id") },
        inverseJoinColumns = { @JoinColumn(name = "Actor_id") })
    @JsonProperty("actors")
    private Set<Actor> actors = new HashSet<>();

    public void addActor(Actor actor) {
      this.actors.add(actor);
    }
}
@Entity()
@Table(name = "Actor")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Actor implements Serializable {

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

    @NotBlank(message = "name is required")
    private String name;

    /*@ManyToMany(mappedBy = "actors")
    @JsonIgnore
    private Set<Film> films = new HashSet<>();*/
}