Есть ли способ поделиться составным первичным ключом класса в отношениях многих к одному? - PullRequest
0 голосов
/ 05 июля 2019

У меня есть два класса TempResult и Result, которым нужно много-к-одному между ними.Tempresult имеет составной ключ.Результату также нужны все атрибуты в составном ключе TempResult, кроме одного, чтобы быть его первичным ключом.

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

Так выглядят мои классы.

Я пытался без установки вставляемого и обновляемого значения false, но затем столбцы повторяютсяи возникает ошибка.

@Entity
@Table(name = "tempResult")
public class TempResult {

    @EmbeddedId
    private TempIdentity tempIdentity;

    @Convert(converter = BooleanConverter.class)
    @Column(name = "attendance",nullable = false)
    private boolean attendance;

    @Column(name = "marks")
    private int marks;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "registrationNo",insertable=false,updatable = false),
            @JoinColumn(name="courseId",insertable=false,updatable = false),
            @JoinColumn(name="year",insertable=false,updatable = false),
            @JoinColumn(name="semester",insertable=false,updatable = false)
    })
    Result result;


}
//Composite id class
@Embeddable
public class TempIdentity implements Serializable {

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

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

        @NotNull
        @Column(name = "year")
        private int year;

        @NotNull
        @Column(name = "semester")
        private int semester;

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "userId",referencedColumnName = "userId")
        User user;
}

Все атрибуты, кроме userId, необходимы в таблице результатов.

@Entity
@Table(name="result")
public class Result {

    @EmbeddedId
    private ResultIdentity resultIdentity;

    @NotNull
    private int marks;
}

// составной ключ таблицы результатов

@Embeddable
public class ResultIdentity implements Serializable {

    private String registrationNo;

    private String courseId;

    private int year;

    private int semester;


Caused by: java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`rms_db`.`#sql-113c_95`, CONSTRAINT `FKa683jvhkm50n035ib6ojqlbu7` FOREIGN KEY (`registration_no`, `course_id`, `year`, `semester`) REFERENCES `result` (`course_id`, `registration_no`, `semeste)

Мне нужно вставить данные в таблицу TempResult. Но это мешает.Может кто-нибудь помочь, пожалуйста ???

1 Ответ

0 голосов
/ 06 июля 2019

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

@Embeddable
public class ResultIdentity implements Serializable {

@Table("registration_no")
private String registrationNo;

@Table("course_id")
private String courseId;

@Table("year")
private int year;

@Table("semester")
private int semester;

Без аннотации @Table Hibernate не может обеспечить привязку этих полей к столбцу. Можете ли вы изменить код для повторного тестирования?

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