Не отображать данные из @ManyToMany, даже если они есть в базе данных.JAVA

Программисты JAVA общаются здесь
Anonymous
Не отображать данные из @ManyToMany, даже если они есть в базе данных.

Сообщение Anonymous »

Вот мой ProjectController:
package db.lab6.projectmanagement.controller;

import db.lab6.projectmanagement.dto.MemberDto;
import db.lab6.projectmanagement.dto.ProjectDto;
import db.lab6.projectmanagement.entity.Member;
import db.lab6.projectmanagement.entity.Project;
import db.lab6.projectmanagement.service.ProjectService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Set;

@RestController
@RequestMapping("/projects")
public class ProjectController {

private final ProjectService projectService;

@Autowired
public ProjectController(ProjectService projectService) {
this.projectService = projectService;
}

@GetMapping("/{projectId}")
private ResponseEntity
getProject(@PathVariable Long projectId) {
return ResponseEntity.ok(projectService.findById(projectId));
}

@PostMapping
public ResponseEntity createProject(@RequestBody ProjectDto projectDto) {
return ResponseEntity.status(HttpStatus.CREATED).body(projectService.create(projectDto));
}

@GetMapping("/{projectId}/members")
public ResponseEntity getAllMembersFromProject(@PathVariable Long projectId) {
return ResponseEntity.ok(projectService.findMembers(projectId));
}

// other mappings
}

Вот мой ProjectService:
package db.lab6.projectmanagement.service.impl;

import db.lab6.projectmanagement.dto.MemberDto;
import db.lab6.projectmanagement.dto.ProjectDto;
import db.lab6.projectmanagement.entity.Member;
import db.lab6.projectmanagement.entity.Project;
import db.lab6.projectmanagement.entity.Role;
import db.lab6.projectmanagement.entity.User;
import db.lab6.projectmanagement.repository.MemberRepository;
import db.lab6.projectmanagement.repository.ProjectRepository;
import db.lab6.projectmanagement.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

@Service
public class ProjectServiceImpl implements ProjectService {

private final ProjectRepository projectRepository;
private final MemberRepository memberRepository;
private final UserService userService;
private final RoleService roleService;

@Autowired
public ProjectServiceImpl(ProjectRepository projectRepository,
MemberRepository memberRepository,
UserService userService,
RoleService roleService) {
this.projectRepository = projectRepository;
this.memberRepository = memberRepository;
this.userService = userService;
this.roleService = roleService;
}

@Override
public Project findById(Long id) {
return projectRepository.findById(id).orElseThrow(() ->
new ProjectNotFoundException(id));
}

@Override
public Project create(ProjectDto projectDto) {

User ownerUser = userService.findByNickname(projectDto.getOwnerNickname());

Role ownerRole = roleService.findByName("OWNER");

Member ownerMember = Member.builder()
.user(ownerUser)
.role(ownerRole).build();

Set members = new HashSet();
members.add(ownerMember);
Project project = Project.builder()
.name(projectDto.getName())
.description(projectDto.getDescription())
.members(members).build();
return projectRepository.save(project);
}

@Override
public Set findMembers(Long id) {
Project project = findById(id);
return project.getMembers();
}

// other methods
}


Сущность проекта:
package db.lab6.projectmanagement.entity;

import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.HashSet;
import java.util.Set;

@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
@Entity
@Table(name = "projects")
public class Project {

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

@Column(nullable = false)
private String name;

private String description;

@OneToMany(mappedBy = "project", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@JsonIgnore
private Set tasks;

@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "project_member",
joinColumns = @JoinColumn(name = "project_id"),
inverseJoinColumns = @JoinColumn(name = "member_id"))
private Set members;
}

Группа участников:
package db.lab6.projectmanagement.entity;

import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.HashSet;
import java.util.Set;

@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
@Entity
@Table(name = "members")
public class Member {

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

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "user_id", nullable = false)
private User user;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "role_id", nullable = false)
private Role role;

@ManyToMany(mappedBy = "members", fetch = FetchType.EAGER)
@JsonIgnore
private Set
projects;
}

Когда я создаю проект, я получаю проект, включающий участников
t.ex.
{
"id": 1,
"name": "foo name",
"description": "some description",
"members": [
{
"id": 1,
"user": {
"id": 1,
"email": "myemail@gmail.com",
"nickname": "dimitri",
"password": "123456"
},
"role": {
"id": 1,
"name": "OWNER"
}
}
]
}

Но когда я хочу получить проект, я получаю
{
"id": 1,
"name": "foo name",
"description": "some description",
"members": []
}

Дело в том, что в базе данных содержится список участников, привязанных к проекту в project_member.
Я пробовал изменить fetch = FetchType.EAGER на FetchType.LAZY и наоборот, но это не помогло. Я отслеживал sql-запросы, и они выглядели хорошо. Я даже запустил их напрямую в базе данных, и она все вывела правильно.
Вот трассировка sql-запроса, если необходимо
select
p1_0.id,
p1_0.description,
m1_0.project_id,
m1_1.id,
m1_1.role_id,
m1_1.user_id,
p1_0.name
from
projects p1_0
left join
project_member m1_0
on p1_0.id=m1_0.project_id
left join
members m1_1
on m1_1.id=m1_0.member_id
where
p1_0.id=?


Подробнее здесь: https://stackoverflow.com/questions/785 ... e-database

Вернуться в «JAVA»