SBMs
SBMs
1. Pre-Defined Generator
2. Custom Generator**
=> All are Integer type, all works based on +1/+step concept.
=> If we use Generators then manual input for PK is ignored.
=> Incase of MySQL, Auto_Increment type column is created for PK
if we use IDENTITY.
=> Some DBs May not support sequence concept (Oracle supports)
In that case it internally moved to TABLE concept.
Ex:
create sequence hibernate_sequence
start 10
step 5;
*) Custom Generator:
We can define our own PK value generation logic,
using below steps:
1. Define one class that implements IdentifierGenerator
2. override method generate()
3. Define Logic inside generate() method
4. At Entity class
-> use @GenericGenerator annotation
-> provide strategy="FullGeneratorClassName"
-> link with @GeneratedValue value (name==generator)
===code==================
1. Entity class
package com.app.raghu.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name="emptab")
public class Employee {
//@GeneratedValue(strategy = GenerationType.AUTO)
//private Integer empId;
@Id
@GeneratedValue(generator = "testgen")
@GenericGenerator(name = "testgen",
strategy = "com.app.raghu.generator.MyCustGen")
@Column(name="eid")
private String empId;
@Column(name="ename")
private String empName;
@Column(name="esal")
private Double empSal;
@Column(name="edept")
private String empDept;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentifierGenerator;
@Override
public Serializable generate(SharedSessionContractImplementor session, Object
object) throws HibernateException {
3. Repository interface
package com.app.raghu.repo;
import org.springframework.data.jpa.repository.JpaRepository;
import com.app.raghu.entity.Employee;
4. Runner class
package com.app.raghu.runner;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import com.app.raghu.entity.Employee;
import com.app.raghu.repo.EmployeeRepository;
@Component
public class TestQueryRunner implements CommandLineRunner {
@Autowired
private EmployeeRepository repo;
5. application.properties
#Connection Properties
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/boot6am
spring.datasource.username=root
spring.datasource.password=root
#ORM Properties
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect