JPA - проблема с отношением OneToOne, когда два внешних ключа являются первичным ключом для объекта - PullRequest
0 голосов
/ 30 октября 2019

Два внешних ключа действуют как первичный ключ в сущности для OneToOne, я получаю сообщение об ошибке «Указан неверный тип для класса .....»

Когда я пытался отправить данные POST, он получаетвставлен правильно, но GET не работает. Если я изменю OneToOne на OneToMany, он будет работать для POST & GET обоим.

Запрос:

{
    "items": [
        {
            "applicant": {
                "guests": [
                    {
                        "seqNumber": 1,
                        "name": "name",
                        "gender": "gender"
                    }
                ]
            }
        }
    ]
}

Назад Ссылка:

        reservation.getItems().forEach(i -> {
            i.setReservation(reservation);
            i.getApplicant().setItem(i);
            i.getApplicant().getGuests().forEach(g -> g.setApplicant(i.getApplicant()));
        });

Объект резервирования:

@Entity
@Getter
@Setter
public class Reservation {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID_RESERVATION", nullable = false, updatable = false)
    private String reservationId;

    @OneToMany(mappedBy = "reservation", cascade = CascadeType.ALL, orphanRemoval = true)
    @JsonManagedReference
    private Set<Item> items = new HashSet<>();
}

Объект Entity:

@Entity
@Getter
@Setter
@IdClass(Item.ItemKey.class)
public class Item {
    @Id
    @Column(name = "ID_ITEM_RESERVATION", nullable = false, updatable = false)
    private long itemReservationId;

    @Id
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ID_RESERVATION", referencedColumnName = "ID_RESERVATION", nullable = false, updatable = false)
    @JsonBackReference
    private Reservation reservation;

    @OneToOne(mappedBy = "item", cascade = CascadeType.ALL)
    @JsonManagedReference
    private Applicant applicant;

    @Data
    static class ItemKey implements Serializable {
        private Reservation reservation;
        private long itemReservationId;
    }
}

Entity Entity:

@Entity
@Getter
@Setter
@IdClass(Applicant.ApplicantKey.class)
public class Applicant {
    @Id
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "ID_RESERVATION", referencedColumnName = "ID_RESERVATION", nullable = false, updatable = false),
            @JoinColumn(name = "ID_ITEM_RESERVATION", referencedColumnName = "ID_ITEM_RESERVATION", nullable = false, updatable = false)
    })
    @JsonBackReference
    private Item item;

    @OneToMany(mappedBy = "applicant", cascade = CascadeType.ALL, orphanRemoval = true)
    @JsonManagedReference
    private Set<Guest> guests = new HashSet<>();

    @Data
    static class ApplicantKey implements Serializable {
        private Item item;
    }
}

Guest Entity:

@Entity
@Getter
@Setter
@IdClass(Guest.GuestKey.class)
public class Guest {
    @Id
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "ID_RESERVATION", referencedColumnName = "ID_RESERVATION", nullable = false, updatable = false),
            @JoinColumn(name = "ID_ITEM_RESERVATION", referencedColumnName = "ID_ITEM_RESERVATION", nullable = false, updatable = false)
    })
    @JsonBackReference
    private Applicant applicant;

    @Id
    @Column(name = "S_NUMBER", nullable = false, updatable = false)
    private Short seqNumber;

    @Column(name = "N_NAME")
    private String name;

    @Column(name = "CD_GENDER")
    private String gender;

    @Data
    static class GuestKey implements Serializable {
        private Applicant applicant;
        private Short seqNumber;
    }
}

Ожидаемый результат должен быть таким же, как Request, нополучение ошибки "... Указан неверный тип для класса ..."

Вот код .

...