JPA是Java Persistence API的简称,它是一种用于持久化Java对象的标准技术。它可以帮助开发人员将Java对象存储在关系数据库中,并从数据库中读取和更新对象。JPA的删除方法是一个重要的部分,它可以帮助开发人员从数据库中删除对象。
JPA有两种不同的删除方法:remove()和delete()。remove()方法用于从数据库中永久性地删除一个实体,而delete()方法用于将实体标记为已删除(即逻辑删除)。
// remove()方法 public void remove(Object entity) { getEntityManager().remove(entity); } // delete()方法 public void delete(Object entity) { getEntityManager().remove(getEntityManager().merge(entity)); }
使用remove()方法时,必须将实体传递给该方法作为参数。这意味着必须先从数据库中加载该实体,然后才能将其传递给remove()方法。此外,如果要使用remove()方法来永久性地删除一个实体,必须显式地将其放入事务中才能生效。
相反,delete()方法不要求传递已加载的实体作为参数。因此,如果要使用delete()方法来标记一个实体已删除(即逻辑删除),不必显式地将其放入事务中就能生效。此外,delete()方法还会将传递的实体合并到当前上下文中。
因此,当开发人员想要永久性地从数据库中删除一个实体时,应该使用remove()方法;而当想要标记一个实体已删除时(即逻辑删除) ,应该使用delete() 方法。
我们可以通过将引用设置为null来删除映射中的关系,如下所示。
以下代码删除了地址和员工之间的链接,然后从数据库中删除该地址。
Employee emp = new Employee(); emp.setName("Tom"); emp.setId(1); Address addr = new Address(); addr.setId(1); addr.setStreet("street"); addr.setCity("city"); addr.setState("state"); emp.setAddress(addr); em.persist(emp); emp = em.find(Employee.class, 1); addr = emp.getAddress(); emp.setAddress(null); em.remove(addr);
下面的代码来自PersonDaoImpl.java。
package cn..common; import java.util.Date; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.springframework.transaction.annotation.Transactional; @Transactional public class PersonDaoImpl { public void test() { Employee emp = new Employee(); emp.setName("Tom"); emp.setId(1); Address addr = new Address(); addr.setId(1); addr.setStreet("street"); addr.setCity("city"); addr.setState("state"); emp.setAddress(addr); em.persist(emp); emp = em.find(Employee.class, 1); addr = emp.getAddress(); emp.setAddress(null); em.remove(addr); } @PersistenceContext private EntityManager em; }
以下代码来自Address.java。
package cn..common; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class Address { @Id private int id; private String street; private String city; private String state; private String zip; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getStreet() { return street; } public void setStreet(String address) { this.street = address; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getState() { return state; } public void setState(String state) { this.state = state; } public String getZip() { return zip; } public void setZip(String zip) { this.zip = zip; } public String toString() { return "Address id: " + getId() + ", street: " + getStreet() + ", city: " + getCity() + ", state: " + getState() + ", zip: " + getZip(); } }
以下代码来自Employee.java。
package cn..common; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.ManyToOne; @Entity public class Employee { @Id private int id; private String name; @ManyToOne(cascade=CascadeType.PERSIST) Address address; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public String toString() { return "Employee id: " + getId() + " name: " + getName() + " with " + getAddress(); } }下载 Remove_Relationship.zip
以下是数据库转储。
Table Name: ADDRESS Table Name: EMPLOYEE Row: Column Name: ID, Column Type: INTEGER: Column Value: 1 Column Name: NAME, Column Type: VARCHAR: Column Value: Tom Column Name: ADDRESS_ID, Column Type: INTEGER: Column Value: null
JPA教程 -JPA查询连接提取示例以下代码显示了JPQL的连接提取语法。List l = em.createQuery(SELECT e FROM Professor e JOIN FET...
JPA教程 -JPA查询Like示例JPQL支持SQL LIKE操作符,以提供有限形式的字符串模式匹配。每个LIKE表达式由要搜索的字符串表达式,以...
JPA教程 -JPA查询Distinct多对一示例DISTINCT运算符在功能上等同于同名的SQL运算符。收集结果集后,将删除重复值,以便只返回唯...
Java格式 -Java 打印日期/时间格式Java 打印日期/时间格式处理日期,时间和日期时间值。Java 打印日期/时间格式可以应用于格式值...