如何使用 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 脚本?
从 MySQL 到 SQL Server 的 Hibernate + Spring 迁移
如何在 Hibernate、MySQL 应用程序中使用 import.sql 文件将默认数据插入表中