Sunday 8 December 2019

Spring boot: MongoDB: @PersistenceConstructor: Constructor to use while instantiating


@PersistenceConstructor specifies the constructor to be used while instantiating an entity.

Example
@Document("employees")
public class Employee {
 @Id
 private String id;

 @Field("employee_first_name")
 @Indexed(name = "emp_first_name", direction = IndexDirection.ASCENDING)
 private String firstName;

 @Field("employee_last_name")
 private String lastName;

 @Transient
 private String fullName;

 public Employee() {
 }

 @PersistenceConstructor
 public Employee(@Value("#root.employee_first_name") String firstName,
   @Value("#root.employee_last_name") String lastName) {
  System.out.println("Constructor is called");
  this.firstName = firstName;
  this.lastName = lastName;
  this.fullName = this.firstName + "," + this.lastName;
 }


 ......
 ......
}

Find the below working application.

Employee.java
package com.sample.app.entity;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.PersistenceConstructor;
import org.springframework.data.annotation.Transient;
import org.springframework.data.mongodb.core.index.IndexDirection;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

@Document("employees")
public class Employee {
 @Id
 private String id;

 @Field("employee_first_name")
 @Indexed(name = "emp_first_name", direction = IndexDirection.ASCENDING)
 private String firstName;

 @Field("employee_last_name")
 private String lastName;

 @Transient
 private String fullName;

 public Employee() {
 }

 @PersistenceConstructor
 public Employee(@Value("#root.employee_first_name") String firstName,
   @Value("#root.employee_last_name") String lastName) {
  System.out.println("Constructor is called");
  this.firstName = firstName;
  this.lastName = lastName;
  this.fullName = this.firstName + "," + this.lastName;
 }

 public String getId() {
  return id;
 }

 public void setId(String id) {
  this.id = id;
 }

 public String getFirstName() {
  return firstName;
 }

 public void setFirstName(String firstName) {
  this.firstName = firstName;
 }

 public String getLastName() {
  return lastName;
 }

 public void setLastName(String lastName) {
  this.lastName = lastName;
 }

 public String getFullName() {
  return this.fullName;
 }

 public void setFullName(String fullName) {
  this.fullName = fullName;
 }

 @Override
 public String toString() {
  StringBuilder builder = new StringBuilder();
  builder.append("Employee [id=").append(id).append(", firstName=").append(firstName).append(", lastName=")
    .append(lastName).append(", fullName=").append(this.fullName).append("]");
  return builder.toString();
 }

}


EmployeeRepository.java
package com.sample.app.repository;

import java.util.List;
import java.util.stream.Stream;

import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.stereotype.Repository;

import com.sample.app.entity.Employee;

@Repository
public interface EmployeeRepository extends MongoRepository<Employee, String> {
 List<Employee> findByFirstName(String firstName);
 
 List<Employee> findByLastName(String lastName);
 
 List<Employee> findByFirstNameAndLastName(String firstName, String lastName);
 
 @Query("{'firstName' : ?0}")
 Stream<Employee> findAllByCustomQueryAndStream(String firstName);
}


application.properties
spring.data.mongodb.database=myorg
spring.data.mongodb.port=27017
spring.data.mongodb.host=localhost

logging.level.org.springframework.data=WARN


pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>springDataMongo</groupId>
 <artifactId>springDataMongo</artifactId>
 <version>1</version>

 <parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.1.6.RELEASE</version>
 </parent>

 <dependencies>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-mongodb</artifactId>
  </dependency>
 </dependencies>
</project>

App.java
package com.sample.app;

import java.util.Arrays;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.MongoTemplate;

import com.mongodb.MongoClient;
import com.sample.app.entity.Employee;
import com.sample.app.repository.EmployeeRepository;

@SpringBootApplication
public class App {
 @Value("${spring.data.mongodb.database}")
 private String database;

 @Value("${spring.data.mongodb.host}")
 private String host;

 @Value("${spring.data.mongodb.port}")
 private int port;

 @Autowired
 private EmployeeRepository empRepository;

 public static void main(String[] args) {

  SpringApplication.run(App.class, args);
 }

 public void dropPreviousData() {
  MongoClient mongoClient = new MongoClient(host, port);

  MongoOperations mongoOps = new MongoTemplate(mongoClient, database);

  mongoOps.dropCollection("employees");
 }

 @Bean
 public CommandLineRunner demo() {
  return (args) -> {

   dropPreviousData();

   Employee emp1 = new Employee("Phalgun", "Garimella");
   Employee emp2 = new Employee("Sankalp", "Dubey");
   Employee emp3 = new Employee("Arpan", "Garimella");
   Employee emp4 = new Employee("Phalgun", "Dubey");

   empRepository.saveAll(Arrays.asList(emp1, emp2, emp3, emp4));

   List<Employee> emps = empRepository.findAll();
   emps.forEach(System.out::println);

  };
 }
}


Total project structure looks like below.


Run App.java, you can see below messages in console.
Constructor is called
Constructor is called
Constructor is called
Constructor is called
Constructor is called
Constructor is called
Constructor is called
Constructor is called
Employee [id=5d542616e4c7d86066cb98a1, firstName=Phalgun, lastName=Garimella, fullName=Phalgun,Garimella]
Employee [id=5d542616e4c7d86066cb98a2, firstName=Sankalp, lastName=Dubey, fullName=Sankalp,Dubey]
Employee [id=5d542616e4c7d86066cb98a3, firstName=Arpan, lastName=Garimella, fullName=Arpan,Garimella]
Employee [id=5d542616e4c7d86066cb98a4, firstName=Phalgun, lastName=Dubey, fullName=Phalgun,Dubey]

You can download complete working application form this link.



Previous                                                    Next                                                    Home

No comments:

Post a Comment