Merge pull request #5607 from fanatixan/bael-2190

bael-2190
This commit is contained in:
Eric Martin 2018-11-12 21:36:54 -06:00 committed by GitHub
commit 2c5f92e262
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 512 additions and 0 deletions

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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() {
}
}

View File

@ -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();
}
}

View File

@ -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)
);

View File

@ -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