Le mappage de Table Unique pour Intégrable Collection en JPA
J'ai une assez unique de la situation en essayant de carte une table unique pour de multiples entités JPA. J'ai lu sur @Embeddable et @pour valeur elementcollection, mais je ne suis pas sûr de la façon de les utiliser dans ma situation (ou si je peux). Une table de base de données est titulaire d'informations sur les Cours. Il peut y avoir des lignes de la table où tout le Parcours est le même, sauf pour quelques valeurs, telles que le numéro de la chambre et par jour. Par exemple:
TERM_CODE SUBJECT_CODE ROOM DAY INSTRUCTOR_ID
201220 EGRE 0101 TR 123
201220 EGRE 0103 W 124
Est-il une manière que je peux extraire des données à partir de deux lignes comme ci-dessus, et de mettre les données communes à l'un des Objets et des valeurs différentes dans une Collection d'Objets distincts? Voici un exemple de la façon dont j'aimerais avoir les classes définies:
@Entity
public class Course implements Serializable {
@Id
@Column(name = "TERM_CODE")
private Long termCode;
@Column(name = "SUBJECT_CODE")
private String subjectCode;
@Embedded
Collection<CourseSchedule> schedule;
public Long getTermCode() {
return termCode;
}
public void setTermCode(Long termCode) {
this.termCode = termCode;
}
public String getSubjectCode() {
return subjectCode;
}
public void setSubjectCode(String subjectCode) {
this.subjectCode = subjectCode;
}
}
CourseSchedule:
@Embeddable
public class CourseSchedule {
private String room;
private String day;
public String getRoom() {
return room;
}
public void setRoom(String room) {
this.room = room;
}
public String getDay() {
return day;
}
public void setDay(String day) {
this.day = day;
}
public String getInstructorId() {
return instructorId;
}
public void setInstructorId(String instructorId) {
this.instructorId = instructorId;
}
}
Moi aussi je suis confus quant à ce que mes JPQL pourrait ressembler dans cette situation une fois que je les reçois mappé.
EDIT:
Si j'ajoute @Id à la TERM_CODE colonne, un Cours d'objet est retourné sans Hibernate erreurs, mais le CourseSchedule Collection qui fait partie du Cours est null.
EDIT 2:
J'ai essayé de jouer avec le traitement Sûr et CourseSchedule que deux tables distinctes (même si ils ne le sont pas), mais je n'arrive pas à obtenir d'eux, joint à l'aide de @OneToMany et @ManyToOne.
@Entity
@IdClass(CourseId.class)
@Table(name = "course_table")
public class Course implements Serializable {
@OneToMany(mappedBy = "course")
private Collection<CourseSchedule> schedule;
@Id
@Column(name = "TERM_CODE")
private Long termCode;
@Id
@Column(name = "SUBJECT_CODE")
private Long subjectCode;
...
}
@Entity
@IdClass(CourseScheduleId.class)
@Table(name = "course_table")
public class CourseSchedule implements Serializable {
@ManyToOne
@JoinColumns({
@JoinColumn(name="TERM_CODE", referencedColumnName="TERM_CODE"),
@JoinColumn(name = "SUBJECT_CODE", referencedColumnName="SUBJECT_CODE")
})
private Course course;
@Column(name = "TERM_CODE")
private Long termCode;
@Column(name = "SUBJECT_CODE")
private Long subjectCode;
@Id
private String room;
@Id
private String day;
@Id
@Column(name = "INSTRUCTOR_ID")
private String instructorId;
...
}
(Le CourseId
et CourseScheduleId
sont de simples classes utilisées pour le composite ID.) Au-dessus de la cartographie renvoie l'erreur suivante:
org.hibernate.MappingException: Foreign key (FK82D03688F590EF27:course_table [TERM_CODE,SUBJECT_CODE])) must have same number of columns as the referenced primary key (course_table [ROOM,DAY,INSTRUCTOR_ID)
Je n'ai pas besoin CourseSchedule renvoyant à l'Sûr, si cela peut vous aider rendre cela plus facile.
Des idées? Mon seul autre pensée est de définir la manière la plus complète des entités distinctes (non joint), et puis en quelque sorte la carte à l'aide d'JPQL.
Malheureusement je ne peux pas changer la base de données, et tout ça dans un tableau. Je souhaite que je pourrais le convaincre de la normaliser, mais qui n'est pas le cas.
Si je le lance dans sa forme actuelle, je reçois le message d'erreur "Aucun identifiant spécifié pour l'entité: Cours", j'ai presque aurait dû s'attendre. Un autre problème est que la table de base de données n'a pas de définir une clé primaire.
OriginalL'auteur acvcu | 2012-02-16
Vous devez vous connecter pour publier un commentaire.
J'ai essayé certaines choses, et le plus proche que je obtenir ce que vous voulez, c'est ce(vérifier le setter
setCourse
dans leCourseSchedule
classe):Cours
CourseSchedule
généré table de base de données
Fondamentalement dans l'autre sens. Ce n'est pas tout à fait ce que vous attendez, mais il pourrait vous inspirer pour une meilleure solution, merci de me tenir au courant si vous avez d'autres idées ou trouvé quelque chose d'intéressant...
Je suis retourné et j'ai essayé cette w/out de l'ID généré, mais je ne pouvais pas l'un de mes requêtes pour retour des Cours sans nul CourseSchedule collections. Au lieu d'utiliser l'IDENTIFIANT généré, j'ai utilisé un composite ID sur le CourseSchedule.
OriginalL'auteur bvanvelsen
C'est ce que j'ai trouvé (à moins que quelqu'un arrive avec une meilleure idée):
Carte le Parcours et CourseSchedule à la même table, mais ne pas se joindre à eux:
Dans l'objet de DAO, interroger les Cours et CourseSchedule séparément et ajouter le CourseSchedule collection pour le Cours:
OriginalL'auteur acvcu