example - spring hibernate sessionfactory
¿Cómo creo muchos a muchos mapas de hibernación para propiedades adicionales desde la tabla de unión? (1)
Necesito un mapa de hibernación de muchos a muchos necesitados 3 uniones. He intentado encontrar una solución sin entidad intermedia como LecturerCourse
.
Tengo una relación de muchos a muchos en mi base de datos entre mi profesor y las tablas de cursos. Un profesor puede impartir un curso, mientras que un profesor puede impartir varios cursos.
Tengo cursos almacenados de antemano. Sin embargo, tengo que asignar cursos al profesor. Cuando asigno cursos también almaceno la capacidad de ese curso.
Mi diagrama de base de datos:
Yo uso hibernación y primavera. Necesito un mapeo de hibernación cuando un curso se asigna a cualquier profesor. Necesito agregar valores al campo de capacidad.
El mapeo de mi profesor:
@Entity
@Table(name="LECTURER")
public class Lecturer {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="LECTURER_ID_SEQ")
@SequenceGenerator(name="LECTURER_ID_SEQ", sequenceName="LECTURER_ID_SEQ")
private Long Id;
@Column(name="NAME")
private String name;
@Column(name="SURNAME")
private String surname;
@Column(name="EMAIL")
private String email;
@Column(name="USERNAME")
private String username;
@Column(name="PASSWORD")
private String Password;
@ManyToMany
@JoinTable(
name="LECTURER_COURSE",
joinColumns=@JoinColumn(name="LECTURER_ID"),
inverseJoinColumns=@JoinColumn(name="COURSE_ID")
)
private List<Course> courses;
//getters - setters
}
Mi curso de mapeo:
@Entity
@Table(name="COURSE")
public class Course {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="COURSE_ID_SEQ")
@SequenceGenerator(name="COURSE_ID_SEQ", sequenceName="COURSE_ID_SEQ")
private Long id;
@Column(name="NAME")
private String name;
@Column(name="CODE")
private String code;
}
¿Alguna idea de cómo resolver mi problema?
@EmbeddedId
@Embeddable
anotaciones @EmbeddedId
y @Embeddable
para resolver este problema:
Profesor de clase:
@Entity
@Table(name="LECTURER")
public class Lecturer {
@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.lecturer", cascade=CascadeType.ALL)
Set<LecturerCourse> lecturerCourses == new HashSet<LecturerCourse>();
//all others properties Setters and getters are less relevant.
}
Clase de curso
@Entity
@Table(name="COURSE")
public class Course {
@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.course", cascade=CascadeType.ALL)
Set<LecturerCourse> lecturerCourses == new HashSet<LecturerCourse>();
//all others properties Setters and getters are less relevant.
}
Profesor de clase de curso:
@Entity
@Table(name = "lecturer_course")
@AssociationOverrides({
@AssociationOverride(name = "pk.lecturer",
joinColumns = @JoinColumn(name = "LECTURER_ID")),
@AssociationOverride(name = "pk.course",
joinColumns = @JoinColumn(name = "COURSE_ID")) })
public class LecturerCourse {
private LecturerCourseID pk = new LecturerCourseID();
@Column(name = "CAPACITY", nullable = false, length = 10)
private String capacity;
@EmbeddedId
public LecturerCourseID getPk() {
return pk;
}
}
Ahora la clave principal:
@Embeddable
public class LecturerCourseID implements java.io.Serializable {
private Lecturer lecturer;
private Course course;
@ManyToOne
public Stock getLecturer() {
return lecturer;
}
public void setLecturer(Lecturer lecturer) {
this.lecturer= lecturer;
}
@ManyToOne
public Course getCourse() {
return course;
}
public void setCourse(Course course) {
this.course= course;
}
}
Ahora tu principal debería ser algo como esto:
Lecturer lecturer1 = new Lecturer();
Course math = new Course();
LecturerCourse lecturer1math = new LecturerCourse();
lecturer1math.setCapacity("capacity");
lecturer1math.setLecturer(lecturer1);
lecturer1math.setCourse(math);
lecturer1.getLecturerCourses().add(lecturer1math);
//saving object
session.save(lecturer1);
Debe asegurarse de que la clase marcada como @Embeddable
debe implementar la interfaz del marcador Serializable
.
Espero eso ayude.