Implemenetation: A project with ORM hibernate
HQL
so i changes my implementation like this https://www.javaguides.net/2019/10/hibernate-query-language-tutorial.html but its giving me error. My old implementation works fine but i need likes this process.
This will work
@Override
public Product save(Product product) {
Session session = entityManager.unwrap(Session.class);
session.save(product);
session.close();
return product;
}
I need like this but wont work
public Product saveStudent(Product product) {
Transaction transaction = null;
try (Session session = HibernateUtil.getSessionFactory().openSession()) {
transaction = session.beginTransaction();
Object object = session.save(product);
session.get(Product.class, (Serializable) object);
transaction.commit();
} catch (Exception e) {
if (transaction != null) {
transaction.rollback();
}
e.printStackTrace();
}
return product;
}
@Override
public Product save(Product product) {
Transaction transaction = null;
try (Session session = HibernateUtil.getSessionFactory().openSession()) {
// start a transaction
transaction = session.beginTransaction();
String hql = "INSERT INTO Product (purchase_item, productname, productbrand, productprice, productdescription, productquantity, productexpirationdate) " +
"SELECT purchase_item, productname, productbrand, productprice, productdescription, productquantity, productexpirationdate FROM Product ";
Query query = session.createQuery(hql);
query.executeUpdate();
transaction.commit();
} catch (Exception e) {
if (transaction != null) {
transaction.rollback();
}
e.printStackTrace();
}
return saveStudent(product);
}
This giving me hard time, i try also the container name for mysql but wont work.
package com.product.DAO;
import java.util.Properties;
import com.product.Entity.Product;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.hibernate.service.ServiceRegistry;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class HibernateUtil {
@Autowired
private static HibernateUtilModel hibernateUtilModel;
private static SessionFactory sessionFactory;
public static SessionFactory getSessionFactory() {
if (sessionFactory == null) {
try {
Configuration configuration = new Configuration();
Properties settings = new Properties();
settings.put(Environment.DRIVER, hibernateUtilModel.getDriver());
settings.put(Environment.URL, hibernateUtilModel.getUrl());
settings.put(Environment.USER, hibernateUtilModel.getUser());
settings.put(Environment.PASS, hibernateUtilModel.getPass());
settings.put(Environment.DIALECT, hibernateUtilModel.getDialect());
settings.put(Environment.SHOW_SQL, hibernateUtilModel.getShow_sql());
settings.put(Environment.IMPLICIT_NAMING_STRATEGY,hibernateUtilModel.getIMPLICIT());
settings.put(Environment.PHYSICAL_NAMING_STRATEGY,hibernateUtilModel.getPHYSICAL());
settings.put(Environment.CURRENT_SESSION_CONTEXT_CLASS, "thread");
settings.put(Environment.HBM2DDL_AUTO, hibernateUtilModel.getUpdate());
configuration.setProperties(settings);
configuration.addAnnotatedClass(Product.class);
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties()).build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
} catch (Exception e) {
e.printStackTrace();
}
}
return sessionFactory;
}
}
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Service
public class HibernateUtilModel {
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.driver-class-name}")
private String driver;
@Value("${spring.datasource.username}")
private String user;
@Value("${spring.datasource.password}")
private String pass;
@Value("${spring.jpa.properties.hibernate.dialect}")
private String dialect;
@Value("${spring.jpa.show-sql}")
private String show_sql;
@Value("${spring.jpa.hibernate.naming.implicit-strategy}")
private String IMPLICIT;
@Value("${spring.jpa.hibernate.naming.physical-strategy}")
private String PHYSICAL;
@Value("$spring.jpa.hibernate.ddl-auto}")
private String update;
}
application.yaml
spring:
jackson:
deserialization:
wrap-exceptions: false
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://${MYSQL_HOST:localhost}:${MYSQL_PORT:3306}/dbpoc
username: root
password: root
jpa:
hibernate:
naming:
implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
ddl-auto: update
generate-ddl: false
show-sql: false
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
mvc:
throw-exception-if-no-handler-found: true
web:
resources:
add-mappings: false
sql:
init:
mode: always
continue-on-error: true
server:
port: 8091
docker-compose.yaml
version: '3.8'
networks:
default:
name: product-poc-project-net
external: true
services:
#----------------------------------------------------------------
productmicroservice:
image: productmicroservice:latest
container_name: productmicroservice
restart: always
build:
context: ./
dockerfile: Dockerfile
ports:
- "9001:8091"
environment:
- MYSQL_HOST=mysqldb
- MYSQL_USER=root
- MYSQL_PASSWORD=root
- MYSQL_PORT=3306
- "SPRING_PROFILES_ACTIVE=${ACTIVE_PROFILE}"
depends_on:
- mysqldb
mysqldb:
image: mysql:8.0.28
restart: unless-stopped
container_name: mysqldb
ports:
- "3307:3306"
cap_add:
- SYS_NICE
environment:
MYSQL_DATABASE: dbpoc
MYSQL_ROOT_PASSWORD: root
While application is excuting the app this show
Autowired annotation is not supported
main] f.a.AutowiredAnnotationBeanPostProcessor : Autowired annotation is not supported on static fields: private static com.product.DAO.ProductDAOImpl com.product.ProductMicroserviceApplication.hibernateUtil
productmicroservice | 2022-06-09 13:15:14.672 INFO 1 --- [ main] f.a.AutowiredAnnotationBeanPostProcessor : Autowired annotation is not supported on static fields: private static com.product.DAO.HibernateUtilModel com.product.DAO.HibernateUtil.hibernateUtilModel
Error
java.lang.NullPointerException
productmicroservice | at com.product.DAO.HibernateUtil.getSessionFactory(HibernateUtil.java:40)
productmicroservice | at com.product.DAO.ProductDAOImpl.save(ProductDAOImpl.java:137)
productmicroservice | at com.product.DAO.ProductDAOImpl$$FastClassBySpringCGLIB$$7fcc36eb.invoke(<generated>)
productmicroservice | at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
productmicroservice | at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783)
productmicroservice | at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.ja
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.OptBoolean;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.product.DateDeserializer.DateDeserializer;
import org.hibernate.annotations.DynamicUpdate;
import org.springframework.format.annotation.DateTimeFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@ToString
@Table(name = "tb_product")
@DynamicUpdate
public class Product {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
@Column
private Integer purchase_item;
@NotBlank
@NotNull
@Column
private String productname;
@NotBlank
@NotNull
@Column
private String productbrand;
@NotNull
@Column
private Double productprice;
@NotBlank
@NotNull
@Column
private String productdescription;
@NotNull
@Column
private Integer productquantity;
@NotNull
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
@JsonFormat(pattern = "yyyy-MM-dd", shape = JsonFormat.Shape.STRING, lenient = OptBoolean.FALSE)
@JsonDeserialize(using = DateDeserializer.class)
private Date productexpirationdate;
}