如何使用 Hibernate 从 Sql 数据库中更新、删除对象?

Posted

技术标签:

【中文标题】如何使用 Hibernate 从 Sql 数据库中更新、删除对象?【英文标题】:how to update, delete an object from Sql database using Hibernate? 【发布时间】:2021-04-03 11:34:54 【问题描述】:

说明

我只是想使用 Hibernate 和 mysql 来实现 ORM,但唯一的 正在工作的方法将单个对象添加到数据库,返回 对象列表,通过关键字返回对象列表但删除 对象和更新对象不起作用! 有什么建议吗?

在数据库中创建表没有问题:)

实体

   package dao;

   import java.io.Serializable;
   import javax.persistence.Entity;
   import javax.persistence.Id;

   @Entity
   public class Produit implements Serializable
    
      private static final long serialVersionUID = 8314029847799979249L;

      @Id
      private int ref;      
      private String desig;
      private double prix;
      private int quant;
 
      public Produit() 
 
      public int getId() 
        return ref;
      

      public void setId(int ref) 
        this.ref = ref;
      
      public String getDesig() 
        return desig;
      
      public void setDesig(String desig) 
       this.desig = desig;
      
      public double getPrix() 
       return prix;
      
      public void setPrix(double prix) 
       this.prix = prix;
      
      public int getQuant() 
       return quant;
      
      public void setQuant(int quant) 
       this.quant = quant;
      
 
    

界面

     package dao;

     import java.util.List;

     public interface InterfaceProduit 

        public void addProduit(Produit produit);
        public Produit getProduit(int id);
        public List<Produit> getListProduit();
        public List<Produit> getListProduitbykw(String mc);
        public void updateProduit(Produit p);
        public void deleteProduit(int id);
    
     

实施

     package dao;
     import java.util.List;
     import javax.persistence.EntityManager;
     import javax.persistence.EntityManagerFactory;
     import javax.persistence.EntityTransaction;
     import javax.persistence.Persistence;
     import javax.persistence.Query;
     import javax.transaction.Transactional;

     @Transactional
     public class ImplInterfProduit implements InterfaceProduit

     EntityManager manager;

     public ImplInterfProduit() 
         EntityManagerFactory factory = Persistence.createEntityManagerFactory("sample");
         manager = factory.createEntityManager();   
     

     public void addProduit(Produit produit) 
         EntityTransaction transaction = manager.getTransaction();
         transaction.begin();
         try 
           manager.persist(produit);
           transaction.commit();
         catch(Exception ex) 
           transaction.rollback();
           ex.printStackTrace();
               
     

     public Produit getProduit(int id) 
        Produit p = manager.find(Produit.class, id);    
        return p;
     

     public List<Produit> getListProduit()     
        Query query = manager.createQuery("SELECT p FROM Produit p");   
        return query.getResultList();
     

     public List<Produit> getListProduitbykw(String mc) 
        Query query = manager.createQuery("SELECT p FROM Produit p where 
        p.desig LIKE :x");
        query.setParameter("x", "%"+mc+"%");
        return query.getResultList();
     

     public void updateProduit(Produit p) 
        manager.merge(p);       
     

     public void deleteProduit(int id) 
        Produit p = manager.find(Produit.class, id);
        manager.remove(p);
     
   

persistence.xml

   <?xml version="1.0" encoding="UTF-8"?>
   <persistence xmlns="http://java.sun.com/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
         http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
         version="2.0">
          
       <persistence-unit name="sample">  
          <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
          <properties>
            <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/product"/>
            <property  name="hibernate.connection.username" value="product"/>
            <property  name="hibernate.connection.password" value="product"/>
            <property  name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>  
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>           
         </properties> 
      </persistence-unit>   
   </persistence>

主要

package dao;

public class MainApp 

   public static void main(String[] args) 
    
    Produit p = new Produit();
    p.setId(9114);
    p.setDesig("telecom");
    p.setPrix(654.77);
    p.setQuant(40);
            
    ImplInterfProduit implProd = new ImplInterfProduit();
    
    implProd.addProduit(p);
    implProd.updateProduit(p);
    implProd.deleteProduit(8760);        
     

POM

 <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 
 https://maven.apache.org/xsd/maven-4.0.0.xsd">  
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.yusfi</groupId>
 <artifactId>jpa</artifactId>
 <version>0.0.1-SNAPSHOT</version>

   <dependencies> 
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>5.4.10.Final</version>
    </dependency>

  <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-entitymanager</artifactId>
      <version>4.3.5.Final</version>
  </dependency>

  <dependency>
      <groupId>org.hibernate.javax.persistence</groupId>
      <artifactId>hibernate-jpa-2.0-api</artifactId>
      <version>1.0.1.Final</version>
  </dependency>
  
   <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.46</version>
   </dependency>  
 </dependencies>  
</project>

输出

Hibernate:插入 Produit (design, prix, quant, ref) 值 (?, ?, ?, ?) 休眠:选择 produit0_.ref 作为 ref1_0_0_,produit0_.desig 作为 desig2_0_0_, produit0_.prix 作为 prix3_0_0_,produit0_.quant 作为 quant4_0_0_ 来自 Produit produit0_ where produit0_.ref=?

【问题讨论】:

您可能需要在查询中写入Produit(大写P),以匹配您实体的类名称Produit @Kevin Anderson 对于他们不起作用的删除和更新方法! 'not working" 意思是,他们给出错误?或者更新/删除只是默默地没有发生? 是的@Keving Anderson 只是默默地不会发生吗?但它没有给出任何错误! 正如我所怀疑的那样。可能这些方法应该使用事务,与addProduit 相同。 【参考方案1】:
 public List<Produit> getListProduit()     
    Query query = manager.createQuery("FROM Produit", Produit.class);   
    return query.getResultList();
 

 public List<Produit> getListProduitbykw(String mc) 
    Query query = manager.createQuery("FROM Produit P WHERE P.desig LIKE :x", Produit.class);
    query.setParameter("x", "%"+mc+"%");
    return query.getResultList();
 

【讨论】:

对于他们不起作用的删除和更新方法! 你必须改变一些东西才能更新它 比如更新方法是什么? 在 implProd.updateProduit(p) 之前和 implProd.addProduit(p) 之后,为 p 设置一些新值

以上是关于如何使用 Hibernate 从 Sql 数据库中更新、删除对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JPA/Hibernate 中执行本机 SQL 脚本?

在hibernate中修改生成的SQL

从 MySQL 到 SQL Server 的 Hibernate + Spring 迁移

如何在 Hibernate、MySQL 应用程序中使用 import.sql 文件将默认数据插入表中

如何将 Hibernate 从 MySQL 迁移到 SQL Server?

如何从 Hibernate Criteria API 获取 SQL(*not* 用于日志记录)