在此示例中,您将学习如何在JPA中更新实体对象。我们使用该EntityManager.merge()方法来更新实体。此方法将要保存的实体作为参数,然后将合并的实体作为结果返回。
您可以在下面的代码片段中看到一个简单的示例。这是用于运行ArtistDao类以更新数据库中的艺术家数据的主程序。
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; public class EntityUpdateDemo { public static final String PERSISTENCE_UNIT_NAME = "music"; public static void main(String[] args) { EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME); EntityManager em = factory.createEntityManager(); ArtistDao dao = new ArtistDaoImpl(em); Artist artist = dao.findById(1L); System.out.println("Artist = " + artist); artist.setName("Bon Jovi"); dao.update(artist); artist = dao.findById(artist.getId()); System.out.println("Artist = " + artist); } }
该ArtistDao接口及其实现ArtistDaoImpl类的定义。
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(); }
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(); } }
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>