以下代码示例向您展示如何使用JPA从数据库中删除或删除实体对象。我们要创建的第一个类是ArtistDaoImpl实现ArtistDao。此DAO类通过实体ID或实体对象本身处理删除过程。我们在deleteById(Long id)和delete(Artist artist)方法中定义删除过程。
在那些方法中,我们称该EntityManager.remove()方法。这种方法EntityManager将负责从数据库中删除实体对象。让我们看看下面的DAO代码:
package org.nhooo.example.jpa.dao; import org.nhooo.example.jpa.entity.Artist; import java.util.List; public interface ArtistDao { Artist findById(Long id); void save(Artist artist); void update(Artist artist); List<Artist> getArtists(); void deleteById(Long id); void delete(Artist artist); }
package org.nhooo.example.jpa.dao.impl; import org.nhooo.example.jpa.dao.ArtistDao; import org.nhooo.example.jpa.entity.Artist; import javax.persistence.EntityManager; import javax.persistence.EntityNotFoundException; import javax.persistence.Query; import java.util.List; public class ArtistDaoImpl implements ArtistDao { private EntityManager manager; public ArtistDaoImpl(EntityManager manager) { this.manager = manager; } /** * Find Artist based on the entity Id. * * @param artistId the artist Id. * @return Artist. * @throws EntityNotFoundException when no artist is found. */ public Artist findById(Long artistId) { Artist artist = manager.find(Artist.class, artistId); if (artist == null) { throw new EntityNotFoundException("Can't find Artist for ID " + artistId); } return artist; } @Override public void save(Artist artist) { manager.getTransaction().begin(); manager.persist(artist); manager.getTransaction().commit(); } /** * Update Artist information. * * @param artist an Artist to be updated. */ @Override public void update(Artist artist) { manager.getTransaction().begin(); manager.merge(artist); manager.getTransaction().commit(); } @Override @SuppressWarnings(value = "unchecked") public List<Artist> getArtists() { Query query = manager.createQuery("select a from Artist a", Artist.class); return query.getResultList(); } /** * Delete artist by their Id. * * @param id the artist Id. */ @Override public void deleteById(Long id) { Artist artist = manager.find(Artist.class, id); if (artist != null) { manager.getTransaction().begin(); manager.remove(artist); manager.getTransaction().commit(); } } /** * Delete artist entity. * * @param artist the object to be deleted. */ @Override public void delete(Artist artist) { manager.getTransaction().begin(); manager.remove(artist); manager.getTransaction().commit(); } }
在类中定义了delete方法之后,ArtistDao我们创建一个简单的程序来演示这两个方法。在此程序中,我们首先EntityManagerFactory从persistence.xml文件中定义的持久性单元创建对象。然后,我们创建EntityManager对象并将其传递给我们的ArtistDaoImpl对象。然后,我们调用delete方法从数据库中删除实体。
为了向您显示删除过程的结果,我们在调用delete方法之前和之后打印出艺术家数据。
package org.nhooo.example.jpa; import org.nhooo.example.jpa.dao.ArtistDao; import org.nhooo.example.jpa.dao.impl.ArtistDaoImpl; import org.nhooo.example.jpa.entity.Artist; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import java.util.List; public class EntityRemoveDemo { public static final String PERSISTENCE_UNIT_NAME = "music"; public static void main(String[] args) { EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME); EntityManager manager = factory.createEntityManager(); ArtistDao dao = new ArtistDaoImpl(manager); System.out.println("Before Delete:"); printArtists(dao.getArtists()); // 移除ID = 1的演出者。 dao.deleteById(1L); // 移除ID = 2的演出者。 Artist artist = dao.findById(2L); dao.delete(artist); System.out.println("After Delete:"); printArtists(dao.getArtists()); } private static void printArtists(List<Artist> artists) { for (Artist artist : artists) { System.out.println("Artist = " + artist); } } }
这是我们的代码片段的结果。它显示删除过程之前和之后的记录数。
Before Delete: Artist = Artist{id=1, name='Bon Jovi'} Artist = Artist{id=2, name='Mr. Big'} Artist = Artist{id=3, name='Metallica'} After Delete: Artist = Artist{id=3, name='Metallica'}
Maven依赖
<dependencies> <!-- https://search.maven.org/remotecontent?filepath=javax/persistence/javax.persistence-api/2.2/javax.persistence-api-2.2.jar --> <dependency> <groupId>javax.persistence</groupId> <artifactId>javax.persistence-api</artifactId> <version>2.2</version> </dependency> <!-- https://search.maven.org/remotecontent?filepath=org/hibernate/hibernate-core/5.4.1.Final/hibernate-core-5.4.1.Final.jar --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.4.1.Final</version> </dependency> <!-- https://search.maven.org/remotecontent?filepath=mysql/mysql-connector-java/5.1.47/mysql-connector-java-5.1.47.jar --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> </dependencies>