Составной первичный ключ и внешний ключ одновременно в JPA HibernateJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Составной первичный ключ и внешний ключ одновременно в JPA Hibernate

Сообщение Anonymous »


У меня есть MedicalNote, ссылающийся на идентификаторы врача и пациента, и у меня есть атрибут даты. Все они составляют первичный ключ для MedicalNote. MedicalNote и Доктор, и Пациент имеют двунаправленное отношение один ко многим. Я хочу убедиться, что это правильный способ реализовать это в Hibernate.

Медицинская записка

пакет com.example.doctorkom.Entities; импортировать jakarta.persistence.*; импорт ломбок.*; импортировать java.sql.Date; @Сущность @Table(name = "MedicalNote") @IdClass(MedicalNoteId.class) @Данные @Builder @NoArgsConstructor @AllArgsConstructor общественный класс MedicalNote { @Column(name = "Диагноз") частная строковая диагностика; @Column(name = "Расследования") частные расследования строк; @Column(name = "Рецепт") частный строковый рецепт; @Идентификатор @Column(name = «Дата») личная дата; дата; @Идентификатор @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH}) @JoinColumn(name = "ИдентификаторПациента") частный Пациент Пациент; @Идентификатор @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH}) @JoinColumn(name = "DoctorId") частный врач-врач; } MedicalNoteId

пакет com.example.doctorkom.Entities; импорт ломбок.*; импортировать java.io.Serializable; импортировать java.sql.Date; @Getter @Сеттер @Нанизывать @EqualsAndHashCode @NoArgsConstructor @AllArgsConstructor публичный класс MedicalNoteId реализует Serializable { частный Пациент Пациент; частный врач-врач; личная дата; дата; } Доктор

пакет com.example.doctorkom.Entities; импортировать jakarta.persistence.*; импорт ломбок.*; импортировать org.hibernate.Hibernate; импортировать org.hibernate.proxy.HibernateProxy; импортировать java.util.ArrayList; импортировать java.util.List; импортировать java.util.Objects; @Сущность @Table(name = "Доктор") @Данные @Builder @NoArgsConstructor @AllArgsConstructor Доктор общественного класса { @Идентификатор @Column(name = "Идентификатор пользователя") частный целочисленный идентификатор; @Column(name = "Название") @Enumerated(EnumType.STRING) частное звание доктора; @Column(name = "Специальность") @Enumerated(EnumType.STRING) частная врачебная специальность; @MapsId @OneToOne(каскад = CascadeType.ALL) @JoinColumn(name = "UserId") частный SystemUser systemUser; @OneToMany(mappedBy = "доктор", cascade = CascadeType.ALL, orphanRemoval = true) @ToString.Exclude частный список MedicalNotes; @OneToMany(mappedBy = "доктор", cascade = CascadeType.ALL, orphanRemoval = true) @ToString.Exclude частный список timeSlots; @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH}) @JoinTable( имя = "РаботаетДля", joinColumns = @JoinColumn(name = "DoctorId"), inverseJoinColumns = @JoinColumn(name = "ClinicId") ) @ToString.Exclude частный список клиники; public void addMedicalNote (MedicalNote MedicalNote) { если (medicalNotes == null) { MedicalNotes = новый ArrayList(); } MedicalNotes.add(medicalNote); MedicalNote.setDoctor(это); } void deleteMedicalNote (MedicalNote MedicalNote) { если (medicalNotes != ноль) { MedicalNotes.remove(medicalNote); MedicalNote.setDoctor(ноль); } } public void addTimeSlot (TimeSlot timeSlot) { если (timeSlots == ноль) { timeSlots = новый ArrayList(); } timeSlots.add(timeSlot); timeSlot.setDoctor(это); } void deleteTimeSlot (TimeSlot timeSlot) { если (timeSlots != ноль) { timeSlots.remove(timeSlot); timeSlot.setDoctor(ноль); } } public void addClinic (Клиника) { if (клиники == null) { клиники = новый ArrayList(); } Clinics.add(клиника); Clinic.getDoctors().add(это); } void deleteClinic (Клиника) { if (клиники != null) { Clinics.remove(клиника); Clinic.getDoctors().remove(this); } } } Пациент

пакет com.example.doctorkom.Entities; импортировать jakarta.persistence.*; импорт ломбок.*; импортировать org.hibernate.Hibernate; импортировать org.hibernate.proxy.HibernateProxy; импортировать java.util.ArrayList; импортировать java.util.List; импортировать java.util.Objects; @Сущность @Table(name = "Пациент") @Данные @Builder @NoArgsConstructor @AllArgsConstructor Пациент общественного класса { @Идентификатор @Column(name = "Идентификатор пользователя") частный целочисленный идентификатор; @Column(name = "Профессия") частное занятие String; @Column(name = "Семейное состояние") частная строка maritalStatus; @Column(name = "Страхование") частная страховка String; @MapsId @OneToOne(каскад = CascadeType.ALL) @JoinColumn(name = "UserId") частный SystemUser systemUser; @OneToMany(mappedBy = "пациент", cascade = CascadeType.ALL) @ToString.Exclude частный список медицинские записи; public void addMedicalNote (MedicalNote MedicalNote) { если (medicalNotes == null) { MedicalNotes = новый ArrayList(); } MedicalNotes.add(medicalNote); MedicalNote.setPatient(это); } } Этот способ создает некоторые проблемы при тестировании с помощью H2, подобного этому

@Test void WhenDeleteByDoctorId_thenDeleteMedicalNote () { // Данный Аккаунт пациентаAccount = Account.builder(). электронная почта("[email protected]"). имя пользователя («ДжонСмит1»). пароль("ДжониДжони123"). роль(Роль.ПАЦИЕНТ). строить(); СистемныйПользователь терпеливыйСистемныйПользователь = СистемныйПользователь.строитель(). Имя("Джон"). фамилия("Смит"). дата рождения(Date.valueOf("14 ноября 1985")). пол(Пол.МУЖЧИНА). адрес («Бейкер-стрит, 221Б»). мобильныйТелефон("(555) 555-5555"). стационарный телефон("(555) 123-4567"). учетная запись (учетная запись пациента). строить(); Пациент Пациент = Пациент.строитель(). профессия («Инженер»). Семейный Статус("холост"). страховка("БОБА"). SystemUser (ПользовательСистемы Пациента). строить(); PatientRepository.save(пациент); Аккаунт DoctorAccount = Account.builder(). электронная почта("[email protected]"). имя пользователя("ДокторСмит1"). пароль("Медицинский123"). роль(Роль.ДОКТОР). строить(); СистемныйПользователь докторСистемныйПользователь = СистемныйПользователь.строитель(). имя("Смит"). Фамилия("Здоровье"). дата рождения(Date.valueOf("1976-10-30")). пол(Пол.МУЖЧИНА). адрес("Мейн-стрит, 123"). мобильныйТелефон("(666) 666-6666"). стационарный телефон("(555) 765-4321"). учетная запись (аккаунт врача). строить(); Доктор доктор = Доктор.строитель(). титул(ДокторТитул.ПРОФЕССОР). специальность(Врач-специальность.ОНКОЛОГ). системный пользователь (докторСистемный пользователь). строить(); DoctorRepository.save(доктор); MedicalNote MedicalNote = MedicalNote.builder(). date(Date.valueOf("2023-04-01")). пациент (пациент). врач (доктор). строить(); MedicalNoteRepository.save(medicalNote); пациент.addMedicalNote(medicalNote); доктор.addMedicalNote(medicalNote); PatientRepository.save(пациент); DoctorRepository.save(доктор); // Когда MedicalNoteRepository.deleteByDoctorId(doctor.getId()); // Затем AssertTrue(medicalNoteRepository.findByDoctorId(doctor.getId()).isEmpty()); } ошибка
Спящий режим: вставить в учетную запись (электронная почта, включено, пароль, роль, имя пользователя, идентификатор) значения (?,?,?,?,?,по умолчанию) Спящий режим: вставить в SystemUser (адрес, дату рождения, имя, пол, стационарный телефон, фамилию, мобильный телефон, идентификатор учетной записи) значения (?,?,?,?,?,?,?,?) Спящий режим: вставить в значения пациента (страхование, семейное положение, профессия, идентификатор пользователя) (?,?,?,?) Спящий режим: вставить в учетную запись (электронная почта, включено, пароль, роль, имя пользователя, идентификатор) значения (?,?,?,?,?,по умолчанию) Спящий режим: выберите m1_0.Date,m1_0.DoctorId,d1_0.UserId,d1_0.Специальность,s1_0.AccountId,a1_0.Id,a1_0.Email,a1_0.Включено,a1_0.Пароль,a1_0.Роль,a1_0.Имя пользователя,s1_0.Адрес ,s1_0.Дата рождения,s1_0.Имя,s1_0.Пол,s1_0.Стационарный телефон,s1_0.Фамилия,s1_0.Мобильный телефон,d1_0.Должность,c1_0.DoctorId,c1_1.ClinicId,c1_1.Адрес,a2_0.AccountId,a3_0.Id,a3_0 .Email,a3_0.Включено,a3_0.Пароль,a3_0.Роль,a3_0.Имя пользователя,c1_1.Электронная почта,c1_1.Стационарный телефон,c1_1.Мобильный телефон,c1_1.Имя,m1_0.PatientId,p1_0.UserId,p1_0.Страхование,p1_0.Семейное состояние ,p1_0.Профессия,s2_0.AccountId,a4_0.Id,a4_0.Электронная почта,a4_0.Включено,a4_0.Пароль,a4_0.Роль,a4_0.Имя пользователя,s2_0.Адрес,s2_0.Дата рождения,s2_0.Имя,s2_0.Пол,s2_0 .LandlinePhone,s2_0.LastName,s2_0.MobilePhone,m1_0.Diagnosis,m1_0.Investigations,m1_0.Рецепт от MedicalNote m1_0 присоединиться к доктору d1_0 на d1_0.UserId=m1_0.DoctorId покинул присоединение SystemUser s1_0 на s1_0.AccountId=d1_0.UserId покинул присоединение Учетная запись a1_0 на a1_0.Id=s1_0.AccountId покинула присоединение (WorksFor c1_0 присоединяется к клинике c1_1 на c1_1.ClinicId=c1_0.ClinicId) на d1_0.UserId=c1_0.DoctorId покинула присоединение к ClinicAdmin a2_0 на a2_0.AccountId=c1_1.ClinicId покинула присоединение к учетной записи a3_0 на a3_0.Id=a2_0.AccountId присоединиться к пациенту p1_0 на p1_0.UserId=m1_0.PatientId покинул присоединение к SystemUser s2_0 на s2_0.AccountId=p1_0.UserId покинул присоединение к учетной записи a4_0 на a4_0.Id=s2_0.AccountId где (m1_0.Date, m1_0.DoctorId,m1_0.PatientId) в ((?,?,?)) Спящий режим: вставить в SystemUser (адрес, дата рождения, имя, пол, стационарный телефон, фамилия, мобильный телефон, идентификатор учетной записи) значения (?,?,?,?,?,?,?,?) Спящий режим: вставить в значения врача (специальность, звание, идентификатор пользователя) (?,?,?) Спящий режим: вставка в MedicalNote (Диагностика, Исследования, Рецепт, Дата, DoctorId, PatientId) значения (?,?,?,?,?,?) Спящий режим: выберите m1_0.Date,m1_0.DoctorId,m1_0.PatientId,m1_0.Diagnosis,m1_0.Investigations,m1_0.Prescription from MedicalNote m1_0, где m1_0.DoctorId=? Спящий режим: выберите m1_0.Date,m1_0.DoctorId,m1_0.PatientId,m1_0.Diagnosis,m1_0.Investigations,m1_0.Prescription from MedicalNote m1_0, где m1_0.DoctorId=? org.opentest4j.AssertionFailedError: Ожидается: правда Фактический: ложь
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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