2-Spring Data Jan 25
2-Spring Data Jan 25
---------------------
List<Product>products=IntStream.rangeClosed(1, 2000)
.mapToObj(i-> new Product("product "+i, new
Random().nextDouble(5000)))
.toList();
//productRepo.saveAll(products);
service layer:
-------------------
public List<Product> getAllProductSorted(String field);
public Page<Product> getAllProductPage(int offset, int pageSize);
public Page<Product> getAllProductPageSorted(String field,int offset, int
pageSize);
@Override
public List<Product> getAllProductSorted(String field) {
return productRepo.findAll(Sort.by(Sort.Direction.DESC, field));
}
@Override
public Page<Product> getAllProductPage(int offset, int pageSize) {
return productRepo.findAll(PageRequest.of(offset, pageSize));
}
@Override
public Page<Product> getAllProductPageSorted(String field, int offset, int
pageSize) {
return productRepo.findAll(PageRequest.of(offset,
pageSize).withSort(Sort.by(field)));
}
controller layer:
---------------
@GetMapping(path = "productsorted")
public List<Product> getAllProductSorted(@RequestParam(name="field") String
field) {
return productService.getAllProductSorted(field);
}
//productpage?offset=4&pageSize=20
@GetMapping(path = "productpage")
public Page<Product> getAllProductPage(@RequestParam(name="offset") int
offset,@RequestParam(name="pageSize") int pageSize) {
return productService.getAllProductPage(offset, pageSize);
}
//productpagesorted?offset=4&pageSize=20&field=id
@GetMapping(path = "productpagesorted")
public Page<Product> getAllProductPageSorted(int offset, int pageSize,String
field) {
return productService.getAllProductPageSorted(field, offset, pageSize);
}
Joins:
---------
one to one:
-------------
Employee ------------<>-------- Parking
POJO:
------
Entities:
-----------
@Entity
@Table(name = "emp_table")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int eid;
private String name;
private double salary;
@Entity
@Table(name = "parking_table")
public class Parking {
@JoinColumn(name = "eid_fk")
@OneToOne
private Employee employee;
}
Repository:
------------
@Repository
public interface EmployeeRepo extends JpaRepository<Employee, Integer>{
@Repository
public interface ParkingRepo extends JpaRepository<Parking, Integer>{
}
parking1.setEmployee(emp1);
parking2.setEmployee(emp2);
parking3.setEmployee(emp3);
empRepo.save(emp1);
empRepo.save(emp2);
empRepo.save(emp3);
parkingRepo.save(parking1);
parkingRepo.save(parking2);
parkingRepo.save(parking3);
one to many:
-------------
Department <>-------- Employee
Pojo:
--------
Entities:
--------
@Entity
@Table(name = "dept_table")
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int did;
@Entity
@Table(name = "empdept_table")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int eid;
private String name;
@JoinColumn(name = "did_fk")
@ManyToOne
private Department department;
Initilizing data:
-----------------
d2.getEmployees().add(emp3);
d2.getEmployees().add(emp4);
d3.getEmployees().add(emp5);
deptRepo.save(d1);
deptRepo.save(d2);
deptRepo.save(d3);
empRepo.save(emp1);
empRepo.save(emp2);
empRepo.save(emp3);
empRepo.save(emp4);
empRepo.save(emp5);
Repositories:
-------------
@Repository
public interface DepartmentRepo extends JpaRepository<Department, Integer>{
@Query("SELECT new com.demo.dto.DeptEmpResponse(d.dname, e.name, e.salary)
FROM Department d INNER JOIN d.employees e")
List<DeptEmpResponse> deptEmployeeInformation();
}
@Repository
public interface EmployeeRepo extends JpaRepository<Employee, Integer>{
@Query("SELECT e FROM Employee e WHERE e.eid IN (:eid)")
public List<Employee> findEmployeessByIds(@Param("eid") List<Integer> eid);
}
Requst/response DTO:
----------------------
@JsonIgnoreProperties({"rank","location"})
public class DeptEmpResponse {
private String dname;
private String name;
private double salary;
//@JsonIgnore
private int rank;
//@JsonIgnore
private String location;
}
{
"ids": [1,5]
}
Exception:
---------
public class ResourceNotFoundException extends RuntimeException{
}
Controllers:
------------
@RestController
public class DeptartmentRestController {
@Autowired
public DeptartmentRestController(DepartmentRepo deptRepo) {
this.deptRepo = deptRepo;
}
@Autowired
private DepartmentRepo deptRepo;
@Autowired
private EmployeeRepo empRepo;
List<Employee>employees=empRepo.findEmployeessByIds(employeeRequest.getIds());
return employees;
}
Problem: recursion :
---------------------
one to one
one to many
many to many
@JsonIgnore
@JsonManagedReference:
is used on the OneToMany side
it is the forward part of the mapping/reference and the data
gets serialized normally.
@JsonBackReference :
is used at the @ManyToOne side
@JsonBackReference is is the backward side of the mapping and the
data does not get serialized
Steps:
Add @JsonManagedReference to the getPosts method in the User entity
Add @JsonBackReference to the getUser method of the Post entity
Add @JsonManagedReference to the getUsers method of the Location entity
@JsonBackReference to the getLocation method of the User entity
@JsonIgnore
it is an alternative for the @JsonBackReference.
So we can used @JsonIgnore in place of @JsonBackReference
@JsonIdentityInfo
it can be used in place of the both @JsonManagedReference and
@JsonBackReference.
@JsonIdentityInfo annotation is added to the class and NOT to the
methods.
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id")
EmpDataResponse{
private String dname;
private String name;
private double salary;
}
Ref:
-----
https://www.appsdeveloperblog.com/infinite-recursion-in-objects-with-bidirectional-
relationships/
POJO:
------
public class Employee {
private int eid;
private String name;
private double salary;
Entities:
--------
@Entity
@Table(name = "emp_proj_table")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int eid;
private String name;
private double salary;
Data init:
-------
Employee emp1 = new Employee("sunita", 4000.00);
Employee emp2 = new Employee("keshav", 7000.00);
Employee emp3 = new Employee("gunika", 3400.00);
project1.getEmployees().add(emp1);
project1.getEmployees().add(emp2);
project1.getEmployees().add(emp3);
project2.getEmployees().add(emp4);
project2.getEmployees().add(emp5);
project2.getEmployees().add(emp6);
project3.getEmployees().add(emp7);
project3.getEmployees().add(emp8);
project3.getEmployees().add(emp9);
emp1.getProjects().add(project1);
emp2.getProjects().add(project1);
emp3.getProjects().add(project1);
emp4.getProjects().add(project2);
emp5.getProjects().add(project2);
emp6.getProjects().add(project2);
emp7.getProjects().add(project3);
emp8.getProjects().add(project3);
emp9.getProjects().add(project3);
projectRepo.save(project1);
projectRepo.save(project2);
projectRepo.save(project3);
empRepo.save(emp1);
empRepo.save(emp2);
empRepo.save(emp3);
empRepo.save(emp4);
empRepo.save(emp5);
empRepo.save(emp6);
empRepo.save(emp7);
empRepo.save(emp8);
empRepo.save(emp9);
Repo:
-----
@Repository
public interface EmployeeRepo extends JpaRepository<Employee, Integer>{
@Repository
public interface ProjectRepo extends JpaRepository<Project, Integer>{
spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.ddl-auto= update
step 2:
-------------
@Configuration
@PropertySource("classpath:db.properties")
public class DbConfig {
@Autowired
private Environment environment;
@Bean
public DriverManagerDataSource getDriverManagerDataSource() {
DriverManagerDataSource ds=new DriverManagerDataSource();
ds.setUsername(environment.getProperty("jdbc.username"));
ds.setPassword(environment.getProperty("jdbc.password"));
ds.setDriverClassName(environment.getProperty("jdbc.drivername"));
ds.setUrl(environment.getProperty("jdbc.url"));
return ds;
}
@Configuration
@ComponentScan(basePackages = {"com.productapp"})
@EnableTransactionManagement
@Import(DbConfig.class)
@EnableJpaRepositories(basePackages = "com.productapp.repo",
entityManagerFactoryRef = "emf1", transactionManagerRef = "tx1")
public class AppConfig {
@Bean
public LocalContainerEntityManagerFactoryBean emf1(DataSource dataSource) {
LocalContainerEntityManagerFactoryBean factoryBean=new
LocalContainerEntityManagerFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setPackagesToScan(new String[] {"com.productapp.entity"});
factoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
factoryBean.setJpaProperties(jpaProperites());
return factoryBean;
}
return properties;
}
@Bean
public JpaTransactionManager tx1(EntityManagerFactory emf) {
return new JpaTransactionManager(emf);
}
}