Отображение Hibernate One-One с пунктом «Где» - PullRequest
0 голосов
/ 04 июля 2019

У меня есть три студента Entity, курс и StudentCourse. Студент StudentCourse сохраняет связи между Student & Course и устанавливает startDate при создании этой ассоциации. Когда связь больше не активна, в строке обновляется дата окончания. Я сохраняю ассоциации таким образом, чтобы сохранить историю. Также есть проверка в бэкэнде, чтобы гарантировать, что у студента за раз будет только один курс, для которого есть активная ассоциация, то есть, Дата окончания равна NULL.

В объекте Student я хочу использовать сопоставление один в один в Hibernate с предложением Where, чтобы соответствующие строки в таблице StudentCourse выбирались не только на основе studentId, но и указанного условия where.

Однако, когда я пытаюсь получить StudentCourse Hibernate, возникает исключение о том, что

org.hibernate.HibernateException Более одной строки с данным идентификатор был найден

@Entity     
public class Student {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;

    @OneToOne(mappedBy = "student", fetch = FetchType.LAZY)
    @Where(clause = "endDate IS NULL")
    private StudentCourse studentCourse;

    private String name;
}

Сущность курса:

 @Entity     
    public class Course {
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        private long id;

        private String name;
    }

StudentCourses Entity:

@Entity     
    public class StudentCourses {
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        private long id;

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name="studentId", referencedColumnName="id")
        private Student student;

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name="courseId", referencedColumnName="id")
        private Course course;

        @Temporal(TemporalType.TIMESTAMP)
        private Date endDate;

        @Temporal(TemporalType.TIMESTAMP)
        private Date startDate;
    }

И я также проверил в StudentCourse две записи с одинаковым идентификатором studentId, но у одной из них есть EndDate. Поэтому я ищу только ту, у которой нет установленного endDate.

Есть ли какое-нибудь решение для этого?

1 Ответ

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

Не думаю, что это сработает. Вы можете проверить комментарии об аннотации Where в hibernate's CollectionBinder, где указано, что ее следует использовать с аннотациями полей OneToMay и ManyToMany.

Вы можете добавить выражение where к определению вашей сущности в классе StudentCourse. В этом случае вы всегда получите сущности с endDate отличным от нуля. Я также думаю, что вы могли ошибиться в своей бизнес-логике. Если вы утверждаете, что Student должен иметь только один StudentCourse, вы не должны сохранять столько энтит, как вы. Или, может быть, то, что вы хотите достичь, это так называемое «мягкое удаление», когда вы помечаете некоторые строки как неактивные в вашей БД и не должны использоваться в вашей логике.

Так что используйте studentCourse как коллекцию

@OneToMany
@Where(clause = "endDate IS NULL")
private Collection<StudentCourse> studentCourse;

или использовать аннотацию объекта

@Where(clause = "endDate IS NULL")
class StudentCourse {
...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...