本文将带您了解关于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区别)
- (转) CrudRepository JpaRepository PagingAndSortingRepository 之间的区别
- hibernate +spring sessionfactory 配置
- Hibernate buildSessionFactory方法:构建SessionFactory
- Hibernate SessionFactory 与 JPA EntityManagerFactory
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 之间的区别
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 有很多优点,但是它们也有缺点:
- 这种方式把我们的代码和类库以及具体抽象(如:Page 和 Pageable)绑定。它们不是这个类库独有的,但是我们必须小心不要暴露这些内部实现的细节。
- 通过继承 CrudRepository 接口,我们暴露了所有方法。这可能满足大部分情况,但是我们可能会遇到这样的情况:我们希望获得对公开的方法的更细粒度的控制,例如创建一个不包含 save (...) 和 delete (...) 的 ReadOnlyRepository,此时继承 CrudRepository 就不满足要求了。
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
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 的新手,我不确定是使用 HibernateSessionFactory
还是
JPAEntityManagerFactory
来创建 Hibernate Session
。
这两者有什么区别?使用它们各自的优点和缺点是什么?
答案1
小编典典更喜欢EntityManagerFactory
和EntityManager
。它们由 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的相关信息,请在本站查询。
本文标签: