Может ли Spring Data JPA обеспечить взаимодействие ManyToOne через @JoinColumn - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть приложение Spring Boot, использующее Spring Data REST и Spring Data JPA.У меня есть две предметные области: ученик и классная комната, где много студентов могут принадлежать к одной классной комнате

Ученик:

@Data
@Entity
@Table(name = "STUDENT")
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "STUDENT_ID")
    private Integer studentId;  // This Id has been setup as auto generated in DB

    @Column(name = "ROOM_ID")
    private Integer roomId;

    @ManyToOne
    @JoinColumn(name = "ROOM_ID", nullable = false, updatable = false, insertable = false)
    private Classroom classroom;
   }

Класс:

@Data
@Entity
@Table(name = "CLASSROOM")
public class Classroom {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ROOM_ID")
    private Integer roomId;  // This Id has been setup as auto generated in DB

    @OneToMany(mappedBy = "classroom")
    private List<Student> studentList;

    .....// other fields related to a classroom
  }

И хранилище Student:

public interface StudentRepository extends CrudRepository<Student , Integer>{
  List<Student> findByClassroom(@Param("room") Classroom room);
}

И хранилище Classroom:

public interface ClassroomRepository extends CrudRepository<Classroom , Integer>{
}

И у меня есть основной файл SpringApplication, но нет контроллера.

В таблице CLASSROOM уже есть одна классная комната с номером комнаты = 1.Когда я отправил следующий запрос POST на http://localhost:8080/students,, в таблице учеников была создана новая запись ученика, которая, как я ожидал, потерпит неудачу, потому что в CLASSROOM не существует классной комнаты с id = 100.

Итак, мой вопрос заключается в следующем: может ли Spring Data JPA принудительно установить отношение manyToOne, или это принудительное применение внешнего ключа должно выполняться на стороне базы данных ( столбец not-null ROOM_ID в таблице Student НЕ определенв качестве внешнего ключа нашим администратором базы данных для законного рассмотрения).Если это необходимо сделать на стороне базы данных, какой смысл определять отношение manyToOne в файлах сущностей?

Кроме того, я знаю, что у меня есть избыточные поля класса в сущности Student, я просто не знаю, какие из них оставить в сущности Student (поле roomId или поле "classroom"), потому что когда я создаюстудент, я хочу дать только номер комнаты в запросе.Спасибо!

{ 
  "roomId": 100  // I expect this request to fail because no roomId=100 in the CLASSROOM table.
}

1 Ответ

1 голос
/ 25 сентября 2019

какой смысл определять отношение manyToOne в файлах сущностей

Поскольку это инструмент реляционного сопоставления объектов, позволяющий определять графы сущностей.

Вы находитесь в данный моментПередача roomId, которая в вашем Entity является просто другим полем, поэтому вам нужно удалить это.

@Entity
@Table(name = "STUDENT")
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "STUDENT_ID")
    private Integer studentId;  // This Id has been setup as auto generated in DB

    @ManyToOne
    @JoinColumn(name = "ROOM_ID", nullable = false)
    private Classroom classroom;
}

В Spring Data Rest вы затем определили ассоциацию, передав собственную ссылку на ссылочную сущность.

Ваш запрос должен выглядеть следующим образом:

{ 
  "classroom" : "http://localhost:8080/classrooms/1"
}

Также удаляется идентификатор при отправке новой записи, и, как вы заметили, идентификатор автоматически генерируется вбаза данных.

См. также:

https://www.baeldung.com/spring-data-rest-relationships

...