GVKun编程网logo

Spring Hibernate-CrudRepository和SessionFactory之间的区别(session和sessionfactory区别)

8

本文将带您了解关于SpringHibernate-CrudRepository和SessionFactory之间的区别的新内容,同时我们还将为您解释session和sessionfactory区别的相

本文将带您了解关于Spring Hibernate-CrudRepository和SessionFactory之间的区别的新内容,同时我们还将为您解释session和sessionfactory区别的相关知识,另外,我们还将为您提供关于(转) CrudRepository JpaRepository PagingAndSortingRepository 之间的区别、hibernate +spring sessionfactory 配置、Hibernate buildSessionFactory方法:构建SessionFactory、Hibernate SessionFactory 与 JPA EntityManagerFactory的实用信息。

本文目录一览:

Spring Hibernate-CrudRepository和SessionFactory之间的区别(session和sessionfactory区别)

Spring Hibernate-CrudRepository和SessionFactory之间的区别(session和sessionfactory区别)

我正在考虑使用Hibernate保留我的模型。我似乎找到两种方法来做到这一点。

第一个使用SessionFactory,例如:

public Collection loadProductsByCategory(String category) {        return this.sessionFactory.getCurrentSession()                .createQuery("from test.Product product where product.category=?")                .setParameter(0, category)                .list();    }

另一个使用带注释的子类/接口扩展CrudRepository

@Transactionalpublic interface UserDao extends CrudRepository<User, Long> {  public User findByEmail(String email);}

另外,@Transactional有时我看不到@Repository注释。有什么区别?

我没有找到“何时/应该使用前一种或后一种方法”的答案,因此我可以得到解释吗?

答案1

小编典典

只是您可以在Spring docs网站上找到这些注释的描述。

很快,要回答您的问题,它们之间的区别是它们用于不同的目的。

  • @Transactional用于划分事务中涉及的代码。它放在类和方法上。

  • @Repository 用于定义支持事务的Spring bean,也可以在DI中使用。

它们可以在同一类上使用。

(转) CrudRepository JpaRepository PagingAndSortingRepository 之间的区别

(转) CrudRepository JpaRepository PagingAndSortingRepository 之间的区别

1. 简介

本文介绍三种不同的 Spring Data repository 和它们的功能,包含以下三种:

  • CrudRepository
  • PagingAndSortingRepository
  • JpaRepository
    简单地说,Spring Data 中的每个 repository 都继承自 Repository 接口,但是,除此之外,它们每个又有不同的功能。

2. Spring Data Repositories

首先介绍 JpaRepository,它继承自 PagingAndSortingRepository,而 PagingAndSortingRepository 又继承自 CrudRepository
每个都有自己的功能:

  • CrudRepository 提供 CRUD 的功能。
  • PagingAndSortingRepository 提供分页和排序功能
  • JpaRepository 提供 JPA 相关的方法,如刷新持久化数据、批量删除。

由于三者之间的继承关系,所以 JpaRepository 包含了 CrudRepository 和 PagingAndSortingRepository 所有的 API

当我们不需要 JpaRepository 和 PagingAndSortingRepository 提供的功能时,可以简单使用 CrudRepository。

下面我们通过例子更好地理解它们提供的 API。
首先创建 Product 实体:

@Entity
public class Product { @Id private long id; private String name; // getters and setters } 

然后实现通过名称查询 Product 的操作:

@Repository
public interface ProductRepository extends JpaRepository<Product, Long> { Product findByName(String productName); } 

这样就实现了通过名称查询 Product 的方法,Spring Data Repository 根据方法名自动生成相应的实现。

3. CrudRepository

先看下 CrudRepository 接口的源码:

public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> { <S extends T> S save(S entity); T findOne(ID primaryKey); Iterable<T> findAll(); Long count(); void delete(T entity); boolean exists(ID primaryKey); } 

方法功能介绍:

  • save (...) – 保存多个对象。这里,我们可以传多个对象批量保存。
  • findOne (...) – 根据传入的主键值获取单一对象。
  • findAll (...) – 查询数据库中所有对象。
  • count () – 返回表中记录总数。
  • delete (...) – 根据传入的对象删除记录。
  • exists (...) – 根据传入的主键值判断对象是否存在。
    CrudRepository 接口看起来非常简单,但实际上它提供了所有基本查询保存等操作。

4. PagingAndSortingRepository

PagingAndSortingRepository 接口的源码如下:

public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> { Iterable<T> findAll(Sort sort); Page<T> findAll(Pageable pageable); } 

该接口提供了 findAll(Pageable pageable) 这个方法,它是实现分页的关键。
使用 Pageable 时,需要创建 Pageable 对象并至少设置下面 3 个参数:

  • 1、 每页包含记录数
  • 2、 当前页数
  • 3、 排序
    假设我们要显示第一页的结果集,一页不超过 5 条记录,并根据 lastName 升序排序,下面代码展示如何使用 PageRequest 和 Sort 获取这个结果:
Sort sort = new Sort(new Sort.Order(Direction.ASC, "lastName"));
Pageable pageable = new PageRequest(0, 5, sort); 

5. JpaRepository

JpaRepository 接口源码:

public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> { List<T> findAll(); List<T> findAll(Sort sort); List<T> save(Iterable<? extends T> entities); void flush(); T saveAndFlush(T entity); void deleteInBatch(Iterable<T> entities); } 

简单介绍下每个方法的作用:

  • findAll () – 获取数据库表中所有实体。
  • findAll (…) – 根据条件获取排序后的所有实体。
  • save (…) – 保存多个实体。这里可以传入多个对象批量保存。
  • flush () – 将所有挂起的任务刷新到数据库。
  • saveAndFlush (…) – 保存实体并实时刷新到数据库。
  • deleteInBatch (…) – 删除多个实体。这里可以传入多个对象并批量删除。
    显然,JpaRepository 接口继承自 PagingAndSortingRepository,PagingAndSortingRepository 继承自 CrudRepository,所以 JpaRepository 拥有 CrudRepository 所有的方法。

6. Spring Data Repositories 的缺点

尽管 Spring Data Repositories 有很多优点,但是它们也有缺点:

  1. 这种方式把我们的代码和类库以及具体抽象(如:Page 和 Pageable)绑定。它们不是这个类库独有的,但是我们必须小心不要暴露这些内部实现的细节。
  2. 通过继承 CrudRepository 接口,我们暴露了所有方法。这可能满足大部分情况,但是我们可能会遇到这样的情况:我们希望获得对公开的方法的更细粒度的控制,例如创建一个不包含 save (...) 和 delete (...) 的 ReadOnlyRepository,此时继承 CrudRepository 就不满足要求了。



hibernate +spring sessionfactory 配置

hibernate +spring sessionfactory 配置

<bean id="sessionFactory"> 
<property name="dataSource" ref="dataSource"></property> 
<!--<property name="configLocation" value="hibernate.cfg.xml"></property>-->         (3)
<property name="hibernateProperties"> 
<props> 
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> 
<prop key="hibernate.show_sql">true</prop> 
<prop key="hibernate.format_sql">true</prop> 
<prop key="hibernate.hbm2ddl.auto">update</prop> 
<prop key="hibernate.cache.use_second_level_cache">true</prop> 
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> 
</props> 
</property> 
<property name="packagesToScan" value="xxx.xxx" /> 
</bean> 

上面的就是 hibernate 的 sessionfactory 的配置,其中最下面的 </property> 
<property name="packagesToScan" value="xxx.xxx" /> 
就是告诉 hibernate 在 xxx.xxx 这个包下去搜索注释生成数据库表

如果用(3)的配置就需要 hibernate.cfg.xml

Hibernate buildSessionFactory方法:构建SessionFactory

Hibernate buildSessionFactory方法:构建SessionFactory

buildSessionFactory 方法用于构建一个唯一的 SessionFactory,即 Session 示例的工厂,这个工厂将被应用程序的所有线程共享。

语法:

buildSessionFactory()


返回值:一个新的 SessionFactory 对象。

示例

创建一个 Configuration 对象,然后调用 buildSessionFactory 方法创建一个 SessionFactory 对象。
Configuration config = new Configuration().configure();  //创建Configuration对象
SessionFactory sessionFactory = config.buildSessionFactory();

典型应用

SessionFactory 是 Hibernate 应用中必不可少的对象,要创建该对象就要通过 Configuration 的 configure() 方法,本示例实现创建 SessionFactory 对象,并给出提示信息。

在应用 Hibernate 框架时,首先要创建与数据库对应的持久化类,与持久化类的映射文件,可参考下载的源码,创建 Hibernate 工具类 HibernateUtil,在该类的静态块中实现示例化 SessionFactory,关键代码如下:
private static SessionFactory factory = null;  //SessionFactory对象
static{  //静态块
  try{
    Configuration cfg = new Configuration().configure();  //加载Hibernate配置文件
    cfg.addClass(Users.class);  //加载实体类
    System.out.println("成功的加载了实体类Users");
    factory = cfg.buildSessionFactory();  //示例化SessionFactory
    System.out.println("成功的创建了SessionFactory示例");
  }catch(HibernateException e){
    e.printstacktrace();
  }
}
运行结果如下:
成功的加载了实体类Users
成功的创建了SessionFactory示例

Hibernate SessionFactory 与 JPA EntityManagerFactory

Hibernate SessionFactory 与 JPA EntityManagerFactory

我是 Hibernate 的新手,我不确定是使用 HibernateSessionFactory还是
JPAEntityManagerFactory来创建 Hibernate Session

这两者有什么区别?使用它们各自的优点和缺点是什么?

答案1

小编典典

更喜欢EntityManagerFactoryEntityManager。它们由 JPA 标准定义。

SessionFactory并且Session是特定于休眠的。EntityManager调用引擎盖下的休眠会话。并且如果您需要一些在
中没有的特定功能EntityManager,您可以通过调用获取会话:

Session session = entityManager.unwrap(Session.class);

我们今天的关于Spring Hibernate-CrudRepository和SessionFactory之间的区别session和sessionfactory区别的分享已经告一段落,感谢您的关注,如果您想了解更多关于(转) CrudRepository JpaRepository PagingAndSortingRepository 之间的区别、hibernate +spring sessionfactory 配置、Hibernate buildSessionFactory方法:构建SessionFactory、Hibernate SessionFactory 与 JPA EntityManagerFactory的相关信息,请在本站查询。

本文标签: