我想更多地澄清一下我的问题:
我理解使用SPring Framework(即容器管理的对象生命周期)和Hibernate(在Java对象和关系数据库系统之间使用ORM - 阻抗不匹配解析)的目的。
我理解我们如何自动装配一个对象,Spring在运行时通过查看applicationContext.xml
文件来接管对象的创建和销毁(如果使用Hibernate或任何其他文件,则除了persistence.xml文件)持久性提供者)。
我想做的是以下内容:
我想实现自己的购物服务。我已经用@ Table,@ Id,@ Column等注释了实体(项目),告诉JPA这将存储在数据库中。
我已经有一个由DaoImpl类实现的DAO接口(目前只有添加和删除方法),我已经完成了以下操作:
@Repository
@Transactional
public class MyShopDbDaoImpl implements MyShopDbDao {
// The following named unit will be in my persistence.xml file
// Which will be placed in src/main/resources/META-INF folder
@PersistenceContext(unitName="myShopDbDao")
private EntityManager em;
// Getters for em (simply returns em)
// Setters for em (simply assigns an em supplied in the args.)
// Other query method
}
我还有一个ShopDbController控制器类,它使用:
@Autowired
// defined in the applicationContext.xml file
private MyShopDbDao myShopDbDaoImpl
我正在努力解决的是EntityManagerFactory
和EntityManager
关系的“理解”以及必须如何管理交易。我知道以下层次结构是理解这一点的主要出发点:
客户与控制器交谈。
Controller映射请求并让实体管理员对数据库进行查询和填充(使用JUNIT测试等的测试/本地数据库或实际的SQL类型数据库)。
我所知道的是,可以手动(即开始,提交和关闭会话)或通过Spring容器(即在applicationContext.xml文件中使用bean defs)来管理事务。如何获取有关entitymanagers和entitymanagerfactory的更多信息以便设置我的系统?
我没有发现Oracle / Spring / Hibernate的在线文档非常有用。我需要一个例子和关于entitymanagerfactory,sessionfactory,entitymanager和transactionmanager之间关系的解释。有人可以帮帮我吗?
我不需要别人握住我的手,而只是让我朝着正确的方向前进。我之前做过Spring项目,但从来没有深入到过某些东西。任何帮助表示赞赏。
答案 0 :(得分:2)
EntityManagerFactory
将通过打开/关闭与数据库的新物理连接或使用连接池(c3p0,bonecp,hikari或您喜欢的任何实现)来获取java.sql.Connection
个对象。获得Connection
后,它将使用它来创建新的EntityManager
。 EntityManager
可以使用此Connection
与您的对象和数据库进行互动,并可以通过调用EntityManager#getTransaction
然后调用EntityTransaction#begin
,EntityTransaction#commit
和{{来管理交易1}}内部分别与EntityTransaction#rollback
,Connection#begin
和Connection#commit
一起使用。这是普通的JPA,而Spring在这一点上无所事事。
对于事务管理,Spring可以帮助您避免使用事务管理器(特别是名为JpaTransactionManager
的类)手动打开/关闭事务。此事务管理器将使用您的Connection#rollback
来打开和关闭为一组操作创建的EntityManagerFactory
的事务。这可以使用XML配置或类/方法上的EntityManager
注释来完成。使用这种方法时,您将不再直接使用您的特定类,而是Spring将使用cglib为您的类创建代理,并使用事务管理器类打开事务,调用您的特定方法并执行最后提交或回滚,具体取决于您的配置。除此之外,Spring还提供其他配置,如只读事务(不允许数据修改操作)。
以下是使用Spring / Hibernate / JPA解释上述元素的基本配置:
@Transactional
答案 1 :(得分:1)
非常一般:
因此,如果您想使用hibernate,请使用SessionFactory和session。如果你想让你留下来#34;泛型"使用EntityManagerFactory。
http://www.javabeat.net/jpa-entitymanager-vs-hibernate-sessionfactory/ http://www.theserverside.com/tip/How-to-get-the-Hibernate-Session-from-the-JPA-20-EntityManager
答案 2 :(得分:1)
从我看到的,你的em
引用应该是数据库的一个正常运行的代理对象(这个EntityManager应该是一个spring bean,配置了所有内容,比如DB url,driver等。从这里你的代码不应该取决于你有什么数据库)。您不需要了解您提到的课程(entitymanagerfactory sessionfactory transactionmanager)。简单的例子是:
List<MyBean> bean = (List<MyBean>)em.createNamedQuery("select * from mydb").getResultList();
运行select *查询并直接获取MyBean类型对象应该很容易,没有任何显式转换(这就是hibernate的用途)。
类似于插入:
em.persist(myBean);
其中myBean是为Hibernate注释的东西。
简要介绍一下交易,我发现最好在服务METHODS上注释@Transactional(你是在整个dao上做的)。