как управлять много-к-одному jpa для сохранения и поиска данных с помощью DTO - PullRequest
0 голосов
/ 05 июля 2019

У меня две таблицы с отношением многие-к-одному. Например, у меня есть таблица Office и таблица Employee. Один сотрудник принадлежит одному офису, а один офис - нескольким сотрудникам.

Office

@Entity(name = "office")
@Table(name = "office", uniqueConstraints = {@UniqueConstraint(columnNames = {"id"})})
public class Office {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "office_name", nullable = false)
    private String officeName;
}

Employee

@Entity(name = "employee")
@Table(name = "employee", uniqueConstraints = {@UniqueConstraint(columnNames = {"id"})})
public class Employee {

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

    @Column(name = "employee_name", nullable = false)
    private String employeeName;

    @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
    @JoinColumn(name = "office_id", referencedColumnName = "id", nullable = false)
    @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
    private Office office;
}

OfficeDto

public class OfficeDto {

    private Long id;
    private String officeName;
}

EmployeeDto

public class EmployeeDto {

    private Long id;
    private String employeeName;
    private OfficeDto office;
}

При вышеуказанном способе определения entity и DTO, когда я делаю employee.findAll(), результат JSON также включает детализацию служебных данных.

Есть ли способ, которым я мог бы достичь ( цель ):

  1. Когда вы сохраняете новый employee, я просто должен упомянуть id из office.
  2. Когда findAll сотрудник, я мог выбрать, хочу ли я передать только id или также весь объект клиенту.

Потому что в текущей ситуации мне нужно определить двух сотрудников DTO. Первый содержит все данные офиса (например, код EmployeeDto), а второй заменяет private OfficeDto office на private int office.

1 Ответ

1 голос
/ 05 июля 2019

Вторая задача, которую вы можете решить с помощью проекции: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections Или просто конкретное сопоставление для DTO, для сопоставления вы можете использовать mapstruct: http://mapstruct.org/documentation/installation/

Для первой проблемы я нашел какой-то ответ в стеке, но вам нужно проверить его: JPA отношение многие-к-одному - нужно сохранить только Id

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...