Java文档阅读笔记-Guide to the Hibernate EntityManager

Posted IT1995

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 {
    
    @Id
    private 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 @Autowired
    private 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的主要内容,如果未能解决你的问题,请参考以下文章

Laravel文档阅读笔记-How to Build a Rest API with Laravel: A Beginners Guide①

THE DEFINITIVE GUIDE TO DEBUGGING JAVASCRIPT

How to Trade Cryptocurrency – The Complete Guide

A guide to the Kernel Development Process

The Beginner’s Guide on How to Use TaoBao

Guide to update the Cisco Phone Firmware via CME