commit
2c5f92e262
|
@ -0,0 +1,71 @@
|
|||
package com.baeldung.manytomany.model;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.ManyToMany;
|
||||
import javax.persistence.OneToMany;
|
||||
import javax.persistence.Table;
|
||||
|
||||
@Entity
|
||||
@Table(name = "course")
|
||||
public class Course {
|
||||
|
||||
@Id
|
||||
@Column(name = "id")
|
||||
private Long id;
|
||||
|
||||
@ManyToMany(mappedBy = "likedCourses")
|
||||
private Set<Student> likes;
|
||||
|
||||
@OneToMany(mappedBy = "course")
|
||||
private Set<CourseRating> ratings;
|
||||
|
||||
@OneToMany(mappedBy = "course")
|
||||
private Set<CourseRegistration> registrations;
|
||||
|
||||
// additional properties
|
||||
|
||||
public Course() {
|
||||
}
|
||||
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public Set<CourseRating> getRatings() {
|
||||
return ratings;
|
||||
}
|
||||
|
||||
public Set<CourseRegistration> getRegistrations() {
|
||||
return registrations;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + ((id == null) ? 0 : id.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
Course other = (Course) obj;
|
||||
if (id == null) {
|
||||
if (other.id != null)
|
||||
return false;
|
||||
} else if (!id.equals(other.id))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,79 @@
|
|||
package com.baeldung.manytomany.model;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.EmbeddedId;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.JoinColumn;
|
||||
import javax.persistence.ManyToOne;
|
||||
import javax.persistence.MapsId;
|
||||
import javax.persistence.Table;
|
||||
|
||||
@Entity
|
||||
@Table(name = "course_rating")
|
||||
public class CourseRating {
|
||||
|
||||
@EmbeddedId
|
||||
private CourseRatingKey id;
|
||||
|
||||
@ManyToOne
|
||||
@MapsId("student_id")
|
||||
@JoinColumn(name = "student_id")
|
||||
private Student student;
|
||||
|
||||
@ManyToOne
|
||||
@MapsId("course_id")
|
||||
@JoinColumn(name = "course_id")
|
||||
private Course course;
|
||||
|
||||
@Column(name = "rating")
|
||||
private int rating;
|
||||
|
||||
public CourseRating() {
|
||||
}
|
||||
|
||||
public int getRating() {
|
||||
return rating;
|
||||
}
|
||||
|
||||
public void setRating(int rating) {
|
||||
this.rating = rating;
|
||||
}
|
||||
|
||||
public CourseRatingKey getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public Student getStudent() {
|
||||
return student;
|
||||
}
|
||||
|
||||
public Course getCourse() {
|
||||
return course;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + ((id == null) ? 0 : id.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
CourseRating other = (CourseRating) obj;
|
||||
if (id == null) {
|
||||
if (other.id != null)
|
||||
return false;
|
||||
} else if (!id.equals(other.id))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,59 @@
|
|||
package com.baeldung.manytomany.model;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Embeddable;
|
||||
|
||||
@Embeddable
|
||||
public class CourseRatingKey implements Serializable {
|
||||
|
||||
@Column(name = "student_id")
|
||||
private Long studentId;
|
||||
|
||||
@Column(name = "course_id")
|
||||
private Long courseId;
|
||||
|
||||
public CourseRatingKey() {
|
||||
}
|
||||
|
||||
public Long getStudentId() {
|
||||
return studentId;
|
||||
}
|
||||
|
||||
public Long getCourseId() {
|
||||
return courseId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + ((courseId == null) ? 0 : courseId.hashCode());
|
||||
result = prime * result + ((studentId == null) ? 0 : studentId.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
CourseRatingKey other = (CourseRatingKey) obj;
|
||||
if (courseId == null) {
|
||||
if (other.courseId != null)
|
||||
return false;
|
||||
} else if (!courseId.equals(other.courseId))
|
||||
return false;
|
||||
if (studentId == null) {
|
||||
if (other.studentId != null)
|
||||
return false;
|
||||
} else if (!studentId.equals(other.studentId))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,100 @@
|
|||
package com.baeldung.manytomany.model;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.JoinColumn;
|
||||
import javax.persistence.ManyToOne;
|
||||
import javax.persistence.Table;
|
||||
|
||||
@Entity
|
||||
@Table(name = "course_registration")
|
||||
public class CourseRegistration {
|
||||
|
||||
@Id
|
||||
@Column(name = "id")
|
||||
private Long id;
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "student_id")
|
||||
private Student student;
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "course_id")
|
||||
private Course course;
|
||||
|
||||
@Column(name = "registered_at")
|
||||
private LocalDateTime registeredAt;
|
||||
|
||||
@Column(name = "grade")
|
||||
private int grade;
|
||||
|
||||
// additional properties
|
||||
|
||||
public CourseRegistration() {
|
||||
}
|
||||
|
||||
public Student getStudent() {
|
||||
return student;
|
||||
}
|
||||
|
||||
public void setStudent(Student student) {
|
||||
this.student = student;
|
||||
}
|
||||
|
||||
public Course getCourse() {
|
||||
return course;
|
||||
}
|
||||
|
||||
public void setCourse(Course course) {
|
||||
this.course = course;
|
||||
}
|
||||
|
||||
public LocalDateTime getRegisteredAt() {
|
||||
return registeredAt;
|
||||
}
|
||||
|
||||
public void setRegisteredAt(LocalDateTime registeredAt) {
|
||||
this.registeredAt = registeredAt;
|
||||
}
|
||||
|
||||
public int getGrade() {
|
||||
return grade;
|
||||
}
|
||||
|
||||
public void setGrade(int grade) {
|
||||
this.grade = grade;
|
||||
}
|
||||
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + ((id == null) ? 0 : id.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
CourseRegistration other = (CourseRegistration) obj;
|
||||
if (id == null) {
|
||||
if (other.id != null)
|
||||
return false;
|
||||
} else if (!id.equals(other.id))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,78 @@
|
|||
package com.baeldung.manytomany.model;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.JoinColumn;
|
||||
import javax.persistence.JoinTable;
|
||||
import javax.persistence.ManyToMany;
|
||||
import javax.persistence.OneToMany;
|
||||
import javax.persistence.Table;
|
||||
|
||||
@Entity
|
||||
@Table(name = "student")
|
||||
public class Student {
|
||||
|
||||
@Id
|
||||
@Column(name = "id")
|
||||
private Long id;
|
||||
|
||||
@ManyToMany
|
||||
@JoinTable(name = "course_like", joinColumns = @JoinColumn(name = "student_id"), inverseJoinColumns = @JoinColumn(name = "course_id"))
|
||||
private Set<Course> likedCourses;
|
||||
|
||||
@OneToMany(mappedBy = "student")
|
||||
private Set<CourseRating> ratings;
|
||||
|
||||
@OneToMany(mappedBy = "student")
|
||||
private Set<CourseRegistration> registrations;
|
||||
|
||||
// additional properties
|
||||
|
||||
public Student() {
|
||||
}
|
||||
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public Set<Course> getLikedCourses() {
|
||||
return likedCourses;
|
||||
}
|
||||
|
||||
public Set<CourseRating> getRatings() {
|
||||
return ratings;
|
||||
}
|
||||
|
||||
public Set<CourseRegistration> getRegistrations() {
|
||||
return registrations;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + ((id == null) ? 0 : id.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
Student other = (Student) obj;
|
||||
if (id == null) {
|
||||
if (other.id != null)
|
||||
return false;
|
||||
} else if (!id.equals(other.id))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
package com.baeldung.manytomany;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.persistence.PersistenceContext;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.test.annotation.DirtiesContext;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
@ContextConfiguration(classes = ManyToManyTestConfiguration.class)
|
||||
@DirtiesContext
|
||||
public class ManyToManyIntegrationTest {
|
||||
|
||||
@PersistenceContext
|
||||
EntityManager entityManager;
|
||||
|
||||
@Test
|
||||
public void contextStarted() {
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
package com.baeldung.manytomany;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.PropertySource;
|
||||
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
|
||||
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
|
||||
import org.springframework.orm.jpa.JpaVendorAdapter;
|
||||
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
|
||||
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
|
||||
|
||||
@Configuration
|
||||
@PropertySource("classpath:/manytomany/test.properties")
|
||||
public class ManyToManyTestConfiguration {
|
||||
|
||||
@Bean
|
||||
public DataSource dataSource() {
|
||||
EmbeddedDatabaseBuilder dbBuilder = new EmbeddedDatabaseBuilder();
|
||||
return dbBuilder.setType(EmbeddedDatabaseType.H2)
|
||||
.addScript("classpath:/manytomany/db.sql")
|
||||
.build();
|
||||
}
|
||||
|
||||
@Bean
|
||||
public LocalContainerEntityManagerFactoryBean entityManagerFactory(@Value("${hibernate.hbm2ddl.auto}") String hbm2ddlType, @Value("${hibernate.dialect}") String dialect, @Value("${hibernate.show_sql}") boolean showSql) {
|
||||
LocalContainerEntityManagerFactoryBean result = new LocalContainerEntityManagerFactoryBean();
|
||||
|
||||
result.setDataSource(dataSource());
|
||||
result.setPackagesToScan("com.baeldung.manytomany.model");
|
||||
result.setJpaVendorAdapter(jpaVendorAdapter());
|
||||
|
||||
Map<String, Object> jpaProperties = new HashMap<>();
|
||||
jpaProperties.put("hibernate.hbm2ddl.auto", hbm2ddlType);
|
||||
jpaProperties.put("hibernate.dialect", dialect);
|
||||
jpaProperties.put("hibernate.show_sql", showSql);
|
||||
result.setJpaPropertyMap(jpaProperties);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public JpaVendorAdapter jpaVendorAdapter() {
|
||||
return new HibernateJpaVendorAdapter();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
CREATE TABLE course (
|
||||
id bigint(20) NOT NULL,
|
||||
PRIMARY KEY (id)
|
||||
);
|
||||
|
||||
|
||||
CREATE TABLE student (
|
||||
id bigint(20) NOT NULL,
|
||||
PRIMARY KEY (id)
|
||||
);
|
||||
|
||||
|
||||
CREATE TABLE course_like (
|
||||
student_id bigint(20) NOT NULL,
|
||||
course_id bigint(20) NOT NULL,
|
||||
PRIMARY KEY (student_id, course_id),
|
||||
CONSTRAINT fk_course_like__student FOREIGN KEY (student_id) REFERENCES student (id),
|
||||
CONSTRAINT fk_course_like__course FOREIGN KEY (course_id) REFERENCES course (id)
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE course_rating (
|
||||
course_id bigint(20) NOT NULL,
|
||||
student_id bigint(20) NOT NULL,
|
||||
rating int(11) NOT NULL,
|
||||
PRIMARY KEY (course_id, student_id),
|
||||
CONSTRAINT fk_course_rating__student FOREIGN KEY (student_id) REFERENCES student (id),
|
||||
CONSTRAINT fk_course_rating__course FOREIGN KEY (course_id) REFERENCES course (id)
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE course_registration (
|
||||
id bigint(20) NOT NULL,
|
||||
grade int(11),
|
||||
registered_at datetime NOT NULL,
|
||||
course_id bigint(20) NOT NULL,
|
||||
student_id bigint(20) NOT NULL,
|
||||
PRIMARY KEY (id),
|
||||
CONSTRAINT fk_course_registration__student FOREIGN KEY (student_id) REFERENCES student (id),
|
||||
CONSTRAINT fk_course_registration__course FOREIGN KEY (course_id) REFERENCES course (id)
|
||||
);
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
jdbc.driverClassName=org.h2.Driver
|
||||
jdbc.url=jdbc:h2:mem:myDb;DB_CLOSE_DELAY=-1
|
||||
|
||||
hibernate.dialect=org.hibernate.dialect.H2Dialect
|
||||
hibernate.show_sql=true
|
||||
hibernate.hbm2ddl.auto=validate
|
Loading…
Reference in New Issue