Java文档阅读笔记-Guide to the Hibernate EntityManager
1. Introductino
EntityManager是JPA的一個API,他實現了JPA2.0的程序接口和程序生存周期。
下面將介紹其使用方式。
?
2. Maven Dependencies
引入Hibernate和mysqlJDBC的依賴:
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.4.0.Final</version> </dependency>和
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.13</version> </dependency>3. Configuration
Movie實體類和數據庫中的表一樣對應。后面將會說明使用EntityManager的API去操作Movie的對象。
?
3.1 Defining the Entity
使用@Entity標明其為實體類:
@Entity @Table(name = "MOVIE") public class Movie {@Idprivate Long id;private String movieName;private Integer releaseYear;private String language;// standard constructor, getters, setters }?
3.2 The persistence.xml File
當EntityManagerFactory被創建,就會到環境變量中找META-INF/persistence.xml這個文件。
文件內容如下:
<persistence-unit name="com.baeldung.movie_catalog"><description>Hibernate EntityManager Demo</description><class>com.baeldung.hibernate.pojo.Movie</class> <exclude-unlisted-classes>true</exclude-unlisted-classes><properties><property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/><property name="hibernate.hbm2ddl.auto" value="update"/><property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/><property name="javax.persistence.jdbc.url" value="jdbc:mysql://127.0.0.1:3306/moviecatalog"/><property name="javax.persistence.jdbc.user" value="root"/><property name="javax.persistence.jdbc.password" value="root"/></properties> </persistence-unit>這里定義的這些都是persistence-unit,都是被EntityManger所管理。還定義了一些方言集和JDBC的一些屬性。
?
4. Container and Application Managed EntityManager
EntityManager有兩種類型:一個是Container-Managed和Application-Managed。
?
4.1 Container-Managed EntityManager
這里有個很有意思的話:
@PersistenceContext EntityManager entityManager;這里的意思難道是使用了XXXManagerFactory就可以變成企業級組件??
這個EntityManager有事務的功能,不需要進行手動關閉,如果強制手動關閉,那么會拋出IllegalStateException異常。
?
4.2 Application-Managed EntityManger
手動創建一個EntityManager,這個手動創建的EntityManager需要手動進行管理。
如下:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("com.baeldung.movie_catalog");EntityManagerFacotry調用createEntityManager()創建對象:
public static EntityManager getEntityManager() {return emf.createEntityManager(); }這種EntityManger需要手動關閉。
?
4.3 Thread-Safety
EntityManagerFactory實例以及Hiberante的SessionFactory實例,都是線程安全了。
在多線程中完整的創建如下:
EntityManagerFactory emf = // fetched from somewhere EntityManager em = emf.createEntityManager();EntityManger是現場不安全的,所以每個現場都要創建一個這樣的實例,并且還要進行關閉,如下:
EntityManagerFactory emf = // fetched from somewhere EntityManager em = emf.createEntityManager(); // use it in the current thread或者使用這種方式:
@Service public class MovieService {@PersistenceContext // or even @Autowiredprivate EntityManager entityManager;// omitted }
?
5. Hibernate Entity Operations
EntityManger的API提供了與數據庫交互的方法。
?
5.1 Persisting Entities
保存一個對象:
public void saveMovie() {EntityManager em = getEntityManager();em.getTransaction().begin();Movie movie = new Movie();movie.setId(1L);movie.setMovieName("The Godfather");movie.setReleaseYear(1972);movie.setLanguage("English");em.persist(movie);em.getTransaction().commit(); }?
5.2 Loading Entities
使用find()方法用于檢索數據:
public Movie getMovie(Long movieId) {EntityManager em = getEntityManager();Movie movie = em.find(Movie.class, new Long(movieId));em.detach(movie);return movie; }如果只需要引用實體,調用getReference()方法,他會從代理中返回實體:
Movie movieRef = em.getReference(Movie.class, new Long(movieId));?
5.3 Detaching Entities
將實體從持久層分離,調用detach()方法。
em.detach(movie);?
5.4 Merging Entities
合并實體仿事務的操作,防止并發性的問題。
public void mergeMovie() {EntityManager em = getEntityManager();Movie movie = getMovie(1L);em.detach(movie);movie.setLanguage("Italian");em.getTransaction().begin();em.merge(movie);em.getTransaction().commit(); }?
5.5 Querying for Entities
使用JPQL進行查詢:
public List<?> queryForMovies() {EntityManager em = getEntityManager();List<?> movies = em.createQuery("SELECT movie from Movie movie where movie.language = ?1").setParameter(1, "English").getResultList();return movies; }?
?
5.6 Removing Entities
使用remove()方法移除元素:
public void removeMovie() {EntityManager em = HibernateOperations.getEntityManager();em.getTransaction().begin();Movie movie = em.find(Movie.class, new Long(1L));em.remove(movie);em.getTransaction().commit(); }總結
以上是生活随笔為你收集整理的Java文档阅读笔记-Guide to the Hibernate EntityManager的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python笔记-使用uiautomat
- 下一篇: Java笔记-keytool生成SSL双