簡體   English   中英

HQL/ORM hibernate 實現錯誤 Null

[英]HQL/ORM hibernate Implementation error Null

實現:一個帶有ORM hibernate HQL的項目,所以我像這樣https://www.javaguides.net/2019/10/hibernate-query-language-tutorial.html更改了我的實現,但它給了我錯誤。 我的舊實現工作正常,但我需要喜歡這個過程。

這將起作用

    @Override
    public Product save(Product product) {
        Session session = entityManager.unwrap(Session.class);
            session.save(product);
            session.close();
            return product;
        
    }

我需要這樣但不會工作

    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);
    }
    
    

這讓我很難過,我也嘗試使用 mysql 的容器名稱,但無法正常工作。

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;

    

}

應用程序.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 
      
  

當應用程序正在執行應用程序時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

錯誤


 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;
      
      
      
  

}

修復參考您可以將@Autowired 與靜態字段一起使用嗎?

    private static  HibernateUtilModel hibernateUtilModel;
    @Autowired
    public void setSomeThing(HibernateUtilModel hibernateUtilModel){
        HibernateUtil.hibernateUtilModel= hibernateUtilModel;
    }
    

缺少{

@Value("${spring.jpa.hibernate.ddl-auto}")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM