Data JPA-Association Mapping

 
non-collection collection-type

1...1 (@ManyToOne + FK Column Unique)

Employee---<>Profile

*...1 (@ManyToOne)

Employee---<>Dept

1...* (@OneToMany)

Product---<>Model

*...* (@ManyToMany

Student---<>Course

class Employee{  
   @ManyToOne
   @JoinColumn(name="pidFk",unique = true)
   private Dept dob; //HAS-A
}
class Employee{  
   @ManyToOne
   @JoinColumn(name="didFk")
   private Dept dob; //HAS-A
}

class Product{
@OneToMany
@JoinColumn(name="midFk") 
private Set mobs; //HAS-A
}

class Student{
@ManyToMany
@JoinTable( name="stdcrstab",
joinColumns = @JoinColumn(name="sidFk"), 
inverseJoinColumns = @JoinColumn(name="cidFk") ) 
private Set cob; //HAS-A
}

                               Example 1:(*...1) (@ManyToOne) Employee---<>Dept (HAS-A)

1.Models Class (Employee)
package in.nareshit.raghu.model; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor @Entity @Table(name="emptab") public class Employee { @Id @Column(name="eid") private Integer empId; @Column(name="ename") private String empName; @Column(name="esal") private Double empSal; @ManyToOne @JoinColumn(name="didFk") private Dept dob; //HAS-A }
2.Models Class (Dept)
package in.nareshit.raghu.model; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor @Entity @Table(name="depttab") public class Dept { @Id @Column(name="did") private Integer deptId; @Column(name="dcode") private String deptCode; @Column(name="dadmin") private String deptAdmin; } 3. Dept Repository package in.nareshit.raghu.repo; import org.springframework.data.jpa.repository.JpaRepository; import in.nareshit.raghu.model.Dept; public interface DeptRepository extends JpaRepository<Dept, Integer> { } 4.Employee Repository package in.nareshit.raghu.repo; import org.springframework.data.jpa.repository.JpaRepository; import in.nareshit.raghu.model.Employee; public interface EmployeeRepository extends JpaRepository<Employee, Integer> { } 5. Runner class package in.nareshit.raghu.runner; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; import in.nareshit.raghu.model.Dept; import in.nareshit.raghu.model.Employee; import in.nareshit.raghu.repo.DeptRepository; import in.nareshit.raghu.repo.EmployeeRepository; @Component public class DataInertRunner implements CommandLineRunner { @Autowired private DeptRepository drepo; @Autowired private EmployeeRepository erepo; public void run(String... args) throws Exception { Dept d1 = new Dept(10,"DEV","SANJAY"); drepo.save(d1); Employee e1 = new Employee(1, "A", 2.2, d1); Employee e2 = new Employee(2, "B", 3.2, d1); Employee e3 = new Employee(3, "C", 4.3, d1); erepo.save(e1); erepo.save(e2); erepo.save(e3); } }



Example 2:(1...*) (@OneToMany) Product---<>Model(HAS-A)
1. Model classes package in.nareshit.raghu.model; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor @Entity @Table(name="modeltab") public class Model { @Id @Column(name="mid") private Integer modId; @Column(name="mcode") private String modCode; @Column(name="mcolor") private String modColor; @Column(name="mcost") private Double modCost; } 2. Product Class package in.nareshit.raghu.model; import java.util.Set; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; import javax.persistence.Table; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor @Entity @Table(name="prodtab") public class Product { @Id @Column(name="pid") private Integer prodId; @Column(name="pcode") private String prodCode; @Column(name="pvendor") private String vendor; @OneToMany @JoinColumn(name="midFk") private Set mobs; //HAS-A } 3. Model Interface package in.nareshit.raghu.repo; import org.springframework.data.jpa.repository.JpaRepository; import in.nareshit.raghu.model.Model; public interface ModelRepository extends JpaRepository<Model, Integer> { } 4. Product Repositpry package in.nareshit.raghu.repo; import org.springframework.data.jpa.repository.JpaRepository; import in.nareshit.raghu.model.Product; public interface ProductRepository extends JpaRepository<Product, Integer> { } 5. Runner class package in.nareshit.raghu.runner; import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; import in.nareshit.raghu.model.Model; import in.nareshit.raghu.model.Product; import in.nareshit.raghu.repo.ModelRepository; import in.nareshit.raghu.repo.ProductRepository; @Component public class TestDataInertRunner implements CommandLineRunner { @Autowired private ModelRepository mrepo; @Autowired private ProductRepository prepo; public void run(String... args) throws Exception { Model m1 = new Model(105, "M34","RED", 5200.0); Model m2 = new Model(106, "K45","BLUE", 5400.0); Model m3 = new Model(107, "YT9","PINK", 5900.0); mrepo.save(m1); mrepo.save(m2); mrepo.save(m3); Product p1 = new Product(10, "S-MOBILE", "SANUI", Set.of(m1,m2,m3)); prepo.save(p1); } }


Example 3:(*...*) (@ManyToMany) Student---<>Course (HAS-A)
1. Models (Course)
package in.nareshit.raghu.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name="crstab")
public class Course {
	@Id
	@Column(name="cid")
	private Integer crsId;
	@Column(name="cname")
	private String crsName;
	@Column(name="cfee")
	private Double crsFee;
}
2.Model (Student)
package in.nareshit.raghu.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.Table;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name="stdtab")
public class Student {
	@Id
	@Column(name="sid")
	private Integer stdId;
	@Column(name="sname")
	private String stdName;
	@Column(name="smail")
	private String stdEmail;
	
	@ManyToMany
	@JoinTable(
			name="stdcrstab",
			joinColumns = @JoinColumn(name="sidFk"),
			inverseJoinColumns = @JoinColumn(name="cidFk")
			)
	private Set cob; //HAS-A
	
	
}

3. Repository (Student) 
package in.nareshit.raghu.repo;
import org.springframework.data.jpa.repository.JpaRepository;
import in.nareshit.raghu.model.Student;
public interface StudentRepository 
	extends JpaRepository<Student, Integer> {

}
4.Repository (Course)
package in.nareshit.raghu.repo;
import org.springframework.data.jpa.repository.JpaRepository;
import in.nareshit.raghu.model.Course;
public interface CourseRepository 
	extends JpaRepository<Course, Integer> {

}

5. Runner class
package in.nareshit.raghu.runner;

import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import in.nareshit.raghu.model.Course;
import in.nareshit.raghu.model.Student;
import in.nareshit.raghu.repo.CourseRepository;
import in.nareshit.raghu.repo.StudentRepository;

@Component
public class DataInsertRunner implements CommandLineRunner {

	@Autowired
	private StudentRepository srepo;
	@Autowired
	private CourseRepository crepo;
	
	public void run(String... args) throws Exception {
		Course c1 = new Course(50, "CoreJava", 500.0);
		Course c2 = new Course(51, "SpringBoot", 600.0);
		Course c3 = new Course(52, "Microservices", 800.0);
		crepo.save(c1);
		crepo.save(c2);
		crepo.save(c3);
		Student s1 = new Student(5, "AJAY", "aj@gm.com", Set.of(c1,c2));
		Student s2 = new Student(6, "SYED", "sy@gm.com", Set.of(c2,c3));
		srepo.save(s1);
		srepo.save(s2);		
	}
}

Example 34(1...1) (@ManyToOne) Employee---<>Profile (HAS-A)

1. Model
package in.nareshit.raghu.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name="profiletab")
public class Profile {
	@Id
	@Column(name="prid")
	private Integer profId;
	@Column(name="prcode")
	private String profCode;
	@Column(name="pexp")
	private Double profExp;
	@Column(name="ppack")
	private Double profPack;
}

-----
package in.nareshit.raghu.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name="emptab")
public class Employee {
	@Id
	@Column(name="eid")
	private Integer empId;
	@Column(name="ename")
	private String empName;
	@Column(name="edsg")
	private String empDesg;
	
	@ManyToOne
	@JoinColumn(name="pidFk",unique = true) //no duplicates 
	//@JoinColumn(name="pidFk",unique = true,nullable = false) //no null values even
	private Profile pob;//HAS-A
	
}

2. Repository Interface
package in.nareshit.raghu.repo;

import org.springframework.data.jpa.repository.JpaRepository;

import in.nareshit.raghu.model.Employee;

public interface EmployeeRepository 
extends JpaRepository<Employee, Integer> {

}
-------
package in.nareshit.raghu.repo;

import org.springframework.data.jpa.repository.JpaRepository;

import in.nareshit.raghu.model.Profile;

public interface ProfileRepository 
extends JpaRepository<Profile, Integer> {

}

3.Runner class
package in.nareshit.raghu.runner;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import in.nareshit.raghu.model.Employee;
import in.nareshit.raghu.model.Profile;
import in.nareshit.raghu.repo.EmployeeRepository;
import in.nareshit.raghu.repo.ProfileRepository;

@Component
public class DataInertRunner 
	implements CommandLineRunner
{
	@Autowired
	private ProfileRepository prepo;
	
	@Autowired
	private EmployeeRepository erepo;

	public void run(String... args) throws Exception {
		Profile p1 = new Profile(10, "PER", 8.5, 15.9);
		Profile p2 = new Profile(11, "PET", 5.5, 10.6);
		Profile p3 = new Profile(12, "PTH", 8.0, 12.0);
		
		prepo.save(p1);
		prepo.save(p2);
		prepo.save(p3);
		
		Employee e1 = new Employee(1, "SAM", "DEV", p1);
		Employee e2 = new Employee(2, "SYED", "BA", p2);
		Employee e3 = new Employee(3, "JAI", "QA", p3);
		
		erepo.save(e1);
		erepo.save(e2);
		erepo.save(e3);
		
	}
}