Hibernate / JPA: использование частичного составного первичного ключа от родителя в качестве внешнего ключа и первичного ключа в дочернем - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть 2 класса сущностей: Student является родительским и Address является дочерним с однозначным отображением:

Student

student_id int (pk), roll_no int (pk), имя varchar

Адрес

student_id (pk, fk), страна varchar

student_id в объекте адреса является одновременно первичным ключом и внешним ключом

Студенческий класс Entity:

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

    @EmbeddedId
    private StudentPrimaryKey studentPrimaryKey;

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

    @OneToOne(mappedBy = "student", cascade = CascadeType.ALL)
    private Address address;
    ........

Класс StudentPrimaryKey:

@Embeddable
public class StudentPrimaryKey implements Serializable{

    @Column(name = "student_id")
    private long id;

    @Column(name = "roll_no")
    private long rollNo;
    ....

Адрес Класс Entity:

@Entity
@Table(name = "address")
public class Address {

    @Id
    @Column(name  = "student_id")
    private long id;

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

    @OneToOne
    @JoinColumn(name = "student_id")
    @MapsId
    private Student student;
    .......

Исключение - org.hibernate.AnnotationException: неявная ссылка на столбец в отображении @MapsIdне удается, попробуйте использовать явное referenceColumnNames

Я понимаю, что в родительской таблице есть 2 столбца первичного ключа, и @MapsId не может определить, с каким из них следует сопоставить внешний ключ в родительской таблице, поэтому я попытался использоватьreferencedColumnName в Address Entity -

@OneToOne
    @JoinColumn(name = "student_id", referencedColumnName = "student_id")
    @MapsId
    private Student student; 

Новое исключение: невозможно найти ссылку на столбец в отображении @MapsId: roll_no

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

[ Hibernate - составной первичный ключ содержит внешний ключ

Это один изссылка, которая разделяет ту же проблему, которая говорит, что JPA / hibernate не позволяет частичным составным первичным ключам быть внешними ключами.

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

1 Ответ

1 голос
/ 05 ноября 2019

Если Student может быть однозначно идентифицирован только сочетанием его id и rollNo, то соответствующему Address также требуются оба поля в его первичном / внешнем ключе и они должны выглядеть следующим образом (обратите внимание, что он использует те же @EmbeddedId, StudentPrimaryKey):

@Entity
@Table(name = "address")
public class Address {

    @EmbeddedId
    private StudentPrimaryKey primaryKey;

    @MapsId
    @JoinColumns({
        @JoinColumn(name="student_id", referencedColumnName="student_id"),
        @JoinColumn(name="roll_no", referencedColumnName="roll_no") })
    @OneToOne
    Student student;

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

    ...

Вам также необходимо добавить столбец roll_no в таблицу address.

Если a Student может быть однозначно идентифицирован простым id (как подразумевается вашими Address сопоставлениями), тогда вы можете удалить rollNo из первичного ключа и использовать простое сопоставление @Id для id и @Basicотображение на rollNo.

...