Hibernate @embededId, содержащий внешний ключ объекта с наследованием - PullRequest
0 голосов
/ 20 февраля 2019

Использовал это в качестве моей базовой точки: https://vladmihalcea.com/the-best-way-to-map-a-many-to-many-association-with-extra-columns-when-using-jpa-and-hibernate/

У меня есть сущность с именем Attendance, которая имеет AttendacneId и emebedid, который имеет два столбца lectureId (string) и studenId (UUID).Сущность посещаемости также имеет другие свойства, содержащие связь ManyToOne со студентом и лекцию с использованием @MapsId.Студент расширяет сущность пользователя там, где находится идентификатор.теперь, когда я пытаюсь что-то сохранить, я получаю эту ошибку.

java.util.NoSuchElementException
at java.util.ArrayList$Itr.next(ArrayList.java:860)
at org.hibernate.cfg.annotations.TableBinder.linkJoinColumnWithValueOverridingNameIfImplicit(TableBinder.java:724)
at org.hibernate.cfg.PkDrivenByDefaultMapsIdSecondPass.doSecondPass(PkDrivenByDefaultMapsIdSecondPass.java:37)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1684)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1641)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:286)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83)
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:473)
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:84)
at utility.Utils.<clinit>(Utils.java:60)
at utility.Testing.main(Testing.java:21)

My AttendanceId class

@Embeddable
public class AttendanceId implements Serializable {

@Column(name = "lecture_fid")
@Getter
@Setter
private String lectureId;

@Column(name = "student_fid", columnDefinition = "uuid")
@Getter
@Setter
private UUID studentId;

public AttendanceId() {} 
}

My Attendance class

@Entity
@Table(name = "attendance")
public class Attendance implements Serializable {

@EmbeddedId
@Getter
@Setter(AccessLevel.PRIVATE)
private AttendanceId id;
// other fields


@ManyToOne(fetch = FetchType.LAZY)
@MapsId("lectureId")
private Lecture lecture;

@ManyToOne(fetch = FetchType.LAZY)
@MapsId("studentId")
private Student student;
}

My Student Class

@Entity
@PrimaryKeyJoinColumn(name = "id")
public class Student extends User implements Serializable, 
Comparable<Student> {
// other fields

@OneToMany(mappedBy = "student", fetch = FetchType.LAZY)
@Getter
private List<Attendance> attendances = new ArrayList<>();
}

Мой класс пользователя

@Entity
@Table(name = "users", uniqueConstraints = {
    @UniqueConstraint(columnNames = {"email", "username"})})
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class User implements Serializable {


@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid")
@Column(columnDefinition = "UUID")
@Getter(AccessLevel.PUBLIC)
@Setter(AccessLevel.PUBLIC)
private UUID id;
// other fields.
}

Мой класс лекции

@NamedNativeQueries(
    @NamedNativeQuery(name = "getLectureId", query = "select 
       get_lecture_id()")
    )
@Entity
@Table(name = "lecture")
public class Lecture implements Serializable {

@Id
@Column(name = "id")
@GenericGenerator(name = "lectureIdGenerator",
        strategy = "entities.LectureIdGenerator")
@GeneratedValue(generator = "lectureIdGenerator")
@Getter
@Setter
private String id;

@OneToMany(mappedBy = "lecture", fetch = FetchType.LAZY)
@Getter
private List<Attendance> attendances = new ArrayList<>();
// other fields
}

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

1 Ответ

0 голосов
/ 20 февраля 2019

Попробуйте скопировать его с помощью этого шаблона тестового примера , и я смогу взглянуть на него, как только он будет готов.

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